gpt4 book ai didi

c++ - 使用继承信号解决 Q_PROPERTY NOTIFY

转载 作者:太空狗 更新时间:2023-10-29 22:59:03 26 4
gpt4 key购买 nike

众所周知,继承的信号不能用作Q_PROPERTY NOTIFYer ( 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;
};

是否有更好/更优雅的解决方案来做到这一点?

最佳答案

要防止有人明确使用此信号,您​​可以做的一件事是将其声明为私有(private),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
};

警告:信号不是虚拟的。您不能覆盖信号。但是,实现是可能的。这就是我在这里使用 final 的原因,以防止有人覆盖它。该代码将生成相应的警告,但只要您知道这一事实,它就可以正常工作。

请注意,如果基类具有 Q_OBJECT 宏,纯虚拟信号是否有效,我还没有尝试过!它确实有效,如果你的基类被声明为插件接口(interface)(像这里:https://doc.qt.io/qt-5/qtwidgets-tools-echoplugin-example.html#echointerface-class-definition)

关于c++ - 使用继承信号解决 Q_PROPERTY NOTIFY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38039379/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com