QT_INTERFACES和信号定义

时间:2013-09-11 13:10:10

标签: c++ qt interface signals

如何在接口中定义信号?

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

    // bla, other methods
}

Afaik,信号不应该是虚拟的,但如果我想定义一个信号需要在实现interface =>的类中实现。这该怎么做?或者你只是让它们非抽象......但接口在这里没有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不支持多重继承)。

结论:根据建议,我会选择第一个。

2 个答案:

答案 0 :(得分:3)

  1. 将信号定义为虚拟抽象保护方法。 (而不是受保护,您可以使用signal:keyword)。
  2. 最终对象必须与您的界面和QObject
  3. 相互交叉
  4. 使用dynamic_cast
  5. 投射指向QObject *接口的指针
  6. 将指针连接到必要的插槽
  7. 您可以查看this topic以获取解决方法。

答案 1 :(得分:2)

不幸的是,Qt没有处理来自QObject的多重继承(请参阅this Q&A),因此您无法从中获取所有接口(否则您将无法从多个接口派生)。因此,您可能会使用IQObject

接口
virtual QObject* qObject() = 0

方法,因此您无需始终将它们强制转换为QObject。

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