众所周知,遗传信号不能用作Q_PROPERTY
NOTIFY
(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;
};
有更好/更优雅的解决方案吗?
答案 0 :(得分:1)
你可以采取一些措施来阻止某人明确地使用这个信号,就是将它声明为私有,除了moc-run。这样没有人可以使用信号:
Base
另一个选项,取决于您使用class Base : public QObject {
Q_OBJECT
signals:
virtual void mySignal() = 0;
};
class Derived : public Base {
//...
signals:
void mySignal() final;//mark as final
};
的方式,将使用纯虚拟信号:
{{1}}
警告:信号不是虚拟的。你无法覆盖信号。但是,实现是可能的。这就是为什么我在这里使用final,以防止覆盖它。代码将生成相应的警告,但只要您知道这一事实,它就能正常工作。
请注意,如果基类具有Q_OBJECT宏,我还没有尝试过纯虚拟信号!如果您的基类被声明为插件接口(如此处:https://doc.qt.io/qt-5/qtwidgets-tools-echoplugin-example.html#echointerface-class-definition)
,它确实有效