c++ - 在接口(interface)类中声明抽象信号

标签 c++ qt qt-signals

当实现类已经从 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/

相关文章:

c++ - 在 FreePascal 中使用 C/C++ DLL

c++ - 试图查看 vector<string> 在 map<string, string> 中是否没有值

c++ - 大型数组、std::vector 和堆栈溢出

.net - 使用 Windows Crypto API 的 Windows 2000 和 Windows 2003 RC2 加密/解密?

c++ - QT特别评论//://[num] etc

c++ - MDI Qt 应用程序中的链接器错误 : undefined reference to qInitResources_mdi()

c++ - 更新 QTableView 时,Qt 信号和插槽不起作用

c++ - 数据流 Qt 到标准 C++ 代码

c++ - QObject连接函数

python - 更改的属性不会触发信号