当实现类已经从 QObject/QWidget 派生时,如何在抽象类/接口(interface)中声明 Qt 信号?
class IEmitSomething
{
public:
// this should be the signal known to others
virtual void someThingHappened() = 0;
}
class ImplementEmitterOfSomething : public QWidget, public IEmitSomething
{
// signal implementation should be generated here
signals: void someThingHappended();
}
最佳答案
正如我在最后几天发现的...... Qt 这样做的方式是这样的:
class IEmitSomething
{
public:
virtual ~IEmitSomething(){} // do not forget this
signals: // <- ignored by moc and only serves as documentation aid
// The code will work exactly the same if signals: is absent.
virtual void someThingHappened() = 0;
}
Q_DECLARE_INTERFACE(IEmitSomething, "IEmitSomething") // define this out of namespace scope
class ImplementEmitterOfSomething : public QWidget, public IEmitSomething
{
Q_OBJECT
Q_INTERFACES(IEmitSomething)
signals:
void someThingHappended();
}
现在您可以连接到这些接口(interface)信号了。
如果您在连接信号时无法访问实现,您的连接语句将需要动态转换为 QObject
:
IEmitSomething* es = ... // your implementation class
connect(dynamic_cast<QObject*>(es), SIGNAL(someThingHappended()), ...);
... 这样您就不必将实现类公开给订阅者和客户。是啊!!!
关于c++ - 在接口(interface)类中声明抽象信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17943496/