【问题标题】:Qt, "no such signal" runtime error from child class, having Q_OBJECT macroQt,来自子类的“没有这样的信号”运行时错误,具有 Q_OBJECT 宏
【发布时间】:2015-08-27 09:39:04
【问题描述】:

使用 Qt 5.4,我在处理子类发出的信号时遇到问题。情况是这样的:

有一个

class Player : public QDialog{
Q_OBJECT
/*...*/
public slots: 
  void ReactToAdapter(Adapter::state_t newState);
private:
  Adapter* adapter;
}

class Adapter : public QObject{
Q_OBJECT
public:
  enum state_t {/*...*/}
signals:
  void StateChagned(state_t newState);
}

纯粹是虚拟的。它的一个实现被给出为

class AdapterCAN : public Adapter{
O_OBJECT
/*...*/
}

AdapterCAN 在其一种方法中发出StateChagned

state_t 通过包含随处可见。这三个类都有 Q_OBJECT 宏。

当我尝试做时

Player::ConnectToCANBus(/*...*/){

  adapter = new AdapterCAN(/*...*/);

  connect(adapter, SIGNAL(StateChanged(Adapter::state_t), 
    this, SLOT(ReactToAdapter(Adapter::state_t));

}

这会创建错误消息 QObject::connect: No such signal AdapterCAN::StateChanged(Adapter::state_t) in ..\player.cpp:90 在运行时。

看起来信号没有被继承!?任何人有任何想法我可能做错了什么?谢谢!

【问题讨论】:

  • 尝试将信号声明为void StateChagned(Adapter::state_t);(使用完全限定名称)。
  • 你刚才是不是在 void StateChagned(state_t newState); 中写了错误;
  • @vahancho:省略限定名解决了它!谢谢!

标签: qt inheritance signals parent-child qobject


【解决方案1】:

将信号的定义改为

class Adapter : public QObject{
/*...*/
  void StateChagned(state_t);
}

解决了。限定名称必须省略。

感谢@vahancho 指出这一点!

【讨论】:

    【解决方案2】:

    如果有人在这里找到,请检查您的连接功能是否有错误。我曾经写过这么愚蠢的错误,但是编译器并没有给出任何错误报告。

    connect(m_pInitEncFromDvd1, SIGNAL(signalFinish(int,QStirng)), 
        this, SLOT(slotDVD1InitFinish(int,QString)), 
        (Qt::ConnectionType)(Qt::ConnectionType::AutoConnection | Qt::ConnectionType::UniqueConnection));
    

    注意

    "SIGNAL(signalFinish(int,QStirng))"
    

    ,我不小心把QString写成了QStirng,改正后效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      相关资源
      最近更新 更多