【问题标题】:QT_INTERFACES and signal definitionsQT_INTERFACES 和信号定义
【发布时间】:2013-09-15 12:48:32
【问题描述】:

如何在接口中定义信号?

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 不支持多重继承)。

结论:按照建议,我会选择第一个。

【问题讨论】:

    标签: c++ qt interface signals


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

    您可以查看this topic 以获得一些解决方案。

    【讨论】:

      【解决方案2】:

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

      virtual QObject* qObject() = 0
      

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

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

      【讨论】:

      • qObject 方法保证优于dynamic_cast<QObject*>(pInterface),因此是一个好主意。无法保证dynamic_cast 的复杂性,而qObject 的成本是恒定的。实现QObject * MyClass::qObject() { return this; } 相当于简单的指针算法。
      猜你喜欢
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      相关资源
      最近更新 更多