2

如何在接口中定义信号?

class ISomeInterface
{
    signals:
        virtual void added(const QString& id) = 0;
        virtual void removed(const QString& id) = 0;

    // bla, other methods
}

Afaik,信号不应该是虚拟的,但是如果我想定义一个信号需要在实现接口的类中实现=>怎么做?或者你只是让它们非抽象......但接口在这里没有 Q_OBJECT 声明!在这种情况下是否生成了正确的代码?最重要的是...如果要连接到信号,则需要将错误的 (f* * *g) 强制转换为 QObject。

class ISomeInterface
{
    signals:
        void added(const QString& id);
        void removed(const QString& id);

    // bla, other methods
}

还是您尝试以这种方式实现它?

class ISomeInterface : public QObject
{
    Q_OBJECT

    signals:
        void added(const QString& id);
        void removed(const QString& id);

    // bla, other methods
}

Q_DECLARE_INTERFACE(ISomeInterface, "ISomeInterface")

.. 但是这样我只能从一个接口继承(QObject 不支持多重继承)。

结论:正如建议的那样,我会选择第一个。

4

2 回答 2

3
  1. 将信号定义为虚拟抽象受保护方法。(您可以使用 signal: 关键字代替受保护的)。
  2. 最终对象必须与您的界面和 QObject 交互
  3. 使用 dynamic_cast 将指针转换为指向 QObject * 的接口
  4. 将指针连接到必要的插槽

您可以查看此主题以获取一些解决方案。

于 2013-09-11T13:45:07.213 回答
2

不幸的是,Qt 不处理来自 QObject 的多重继承(请参阅此 Q&A),因此您不能从中派生所有接口(否则您将无法从多个接口派生)。所以相反,你可能有类似IQObject接口的东西

virtual QObject* qObject() = 0

方法,因此您不需要一直将它们强制转换为 QObject。

至于为信号提供接口 - 没有这样的事情。您可以做的是使它们成为虚拟抽象,如果您确实需要强制执行此编译时检查(因为signals:只是 的别名protected:),这将起作用。如果不这样做,只需检查connect()方法的返回值。

于 2013-09-11T13:38:50.813 回答