首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT_INTERFACES和信号定义

QT_INTERFACES和信号定义
EN

Stack Overflow用户
提问于 2013-09-11 13:10:09
回答 2查看 726关注 0票数 2

如何在接口中定义信号?

代码语言:javascript
复制
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)强制转换。

代码语言:javascript
复制
class ISomeInterface
{
    signals:
        void added(const QString& id);
        void removed(const QString& id);

    // bla, other methods
}

还是你试着用这种方式实现它?

代码语言:javascript
复制
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不支持多重继承)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-11 13:45:07

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-09-11 13:38:50

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

代码语言:javascript
复制
virtual QObject* qObject() = 0

方法,因此不需要始终将它们转换为QObject。

至于为信号提供接口-没有这样的东西。您可以做的是使它们成为虚拟抽象,如果您真的需要强制执行这个编译时检查(因为signals:只是protected:的别名),它就可以工作。如果没有,只需检查connect()方法的返回值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18742138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档