代码之家  ›  专栏  ›  技术社区  ›  Rob

虚拟qt信号?

  •  16
  • Rob  · 技术社区  · 14 年前

    在回顾一些QT C++代码时,我遇到了这样的问题:

    class Foo
    {
      Q_OBJECT
    
    signals:
      virtual void someSignal(const QString& str, int n)
      {
        Q_UNUSED(str);
        Q_UNUSED(n);
      }
      ...
    };
    

    现在,qt信号不能有一个主体,所以我很惊讶它甚至可以编译(可能是因为主体实际上是空的)。我也不认为虚拟信号的意义是…它不能有一个主体,所以如何重写它?

    我是在这里找不到什么东西,还是这是一种有效的代码味道?

    4 回复  |  直到 8 年前
        1
  •  17
  •   Gareth Stockwell    14 年前

    我觉得这很难闻。

    在基类中声明一个信号,然后从派生类(例如,

    class MyBase : public QObject
    {
        Q_OBJECT
    // ...
    signals:
        void somethingHappened();
    };
    
    class MyDerived : public MyBase
    {
        Q_OBJECT
    // ...
        void doSomething();
    };
    
    void MyDerived::doSomething()
    {
        // ....
        emit somethingHappened();
    }
    

    也许这就是问题中的宣言所要达到的目标。

        2
  •  4
  •   gregseth    14 年前

    严格地说C++,编译它是正常的。 signal 是一个宏 protected Q_UNUSED 是演员阵容 void . 但你在运行时会出错 moc 它精确地创建了声明为信号的方法的实现。

        3
  •  3
  •   gshep    10 年前

    qt信号不允许是(纯)虚拟的。查看对此Bug的评论- https://bugreports.qt.io/browse/QTBUG-41004

        4
  •  2
  •   Kuba hasn't forgotten Monica    8 年前

    tl;dr:我不知道代码是什么意思,但是它是错误的(不仅仅是闻错了,它表面上是无效的)。信号实现是 总是 计划由主运行中心生成。应拆下信号主体。

    1. 为了使代码正常工作,它应该完成这三项工作:编译、通过MOC和链接。你的代码确实是编译的——C++编译器没有理由不编译。但它不会通过主运行中心,也不会链接。

    2. 尽管可能 莫克 在2010年没有检测到其中的一部分,以下是方法 莫克 今日行动:

      a) 莫克 不允许在具有诊断功能的类体中定义信号 Error: Not a signal declaration . 所以 class X { Q_SIGNAL void s() {} }; 触发它,但是 class X { Q_SIGNAL void s(); }; void X::s() {} 不会。

      b) 莫克 不允许 Q_OBJECT 类中的宏不是派生自 QObject ,带诊断 Error: Class contains Q_OBJECT macro but does not inherit from QObject .

    3. 因为在类中谈论不是从 QObjor ,让我们假设代码实际上如下所示:

      class Foo : public QObject
      {
        Q_OBJECT
      signals:
        virtual void someSignal(const QString&, int);
      };
      void Foo::someSignal(const QString& str, int n)
      {
        Q_UNUSED(str);
        Q_UNUSED(n);
      }
      

      这将通过MOC并编译,但不会链接。链接器将对多个声明发出诊断 Foo::someSignal . 这个文件中有一个定义,MOC生成的源文件中有另一个定义。