繁体   English   中英

QT_INTERFACES和信号定义

[英]QT_INTERFACES and signal definitions

如何在接口中定义信号?

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

    // bla, other methods
}

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

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

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

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

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

不幸的是,Qt不能处理来自QObject的多重继承(请参见本Q&A ),因此您不能从中继承所有接口(否则您将无法从多个接口继承)。 因此,相反,您可能具有类似IQObject接口的内容

virtual QObject* qObject() = 0

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM