使用继承信号解决Q_PROPERTY NOTIFY问题

时间:2016-06-26 14:15:43

标签: c++ qt inheritance signals qt5.6

众所周知,遗传信号不能用作Q_PROPERTY NOTIFYhttps://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;
};

有更好/更优雅的解决方案吗?

1 个答案:

答案 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

,它确实有效