使用继承信号的Q_PROPERTY NOTIFY的解决方法
Workaround to Q_PROPERTY NOTIFY with inherited signal
已知继承信号不能用作Q_PROPERTY
NOTIFY
er (https://bugreports.qt.io/browse/QTBUG-7684)。作为一种变通方法,我在派生类中使用了一个额外的信号,当基信号被触发时,它会被触发。基类:
class Base : public QObject {
Q_OBJECT
signals:
void mySignal();
};
对于派生类:
class Derived : public Base {
Q_OBJECT
Q_PROPERTY(int myPropery READ getMyProperty NOTIFY mySignal_inherited)
public:
Derived(){
connect(this, SIGNAL(mySignal()), this, SIGNAL(mySignal_inherited()));
}
int getMyProperty(){ return myProperty; }
signals:
void mySignal_inherited(); ///< DO NOT USE EXPLICITLY
private:
int myProperty;
};
是否有更好/更优雅的解决方案?
为了防止别人显式地使用这个信号,你可以做的一件事是将它声明为私有的,除了moc-run。这样就没有人可以使用这个信号:
signals:
#ifndef Q_MOC_RUN//this will be defined if moc runs, thus skipped
private:
#endif
void mySignal_inherited(); ///< DO NOT USE EXPLICITLY
另一个选项,取决于你如何使用Base
,将是使用一个纯虚拟信号:
class Base : public QObject {
Q_OBJECT
signals:
virtual void mySignal() = 0;
};
class Derived : public Base {
//...
signals:
void mySignal() final;//mark as final
};
WARNING: Signals不是virtual。您不能覆盖信号。然而,实现是可能的。这就是为什么我在这里使用final,以防止有人覆盖它。代码将生成相应的警告,但只要您知道这个事实,它就能正常工作。
请注意,如果基类有Q_OBJECT宏,我还没有尝试过纯虚拟信号是否有效!如果你的基类被声明为一个插件接口(比如:https://doc.qt.io/qt-5/qtwidgets-tools-echoplugin-example.html#echointerface-class-definition)
相关文章:
- C++模板是否有助于定义单行'property'成员?
- condition_variable.notify是同步点吗
- 'QML Connections: Cannot assign to non-existent Property'尽管情况正好相反
- 对于属性上的 NOTIFY 信号,如果我给它一个参数有什么区别?
- MsiViewFetch "SELECT * FROM `Property`"成功,但返回"Incorrect function." C++
- QApplication::notify()在捕获异常时应该返回什么
- Maven User-Agent property and pluginRepository
- 在C++程序中未使用libpq检索NOTIFY
- Boost/Property树确定值类型
- 如何在Qt中覆盖QApplication::notify
- 等待中的谓词在循环中使用notify时只调用一次
- boost::timed_wait中的Notify条件变量只工作一次
- "static property"值和静态常量值有什么区别?
- 无法在 qml 中创建C++类对象"Cannot assign object to list property "数据" "
- What is boost::program_options::notify() for?
- 有没有相当于 Python @property装饰器的 C++11?
- QThread和notify的实现
- 使用继承信号的Q_PROPERTY NOTIFY的解决方法