Qt,来自子类的“没有这样的信号”运行时错误,具有 Q_OBJECT 宏

Posted

技术标签:

【中文标题】Qt,来自子类的“没有这样的信号”运行时错误,具有 Q_OBJECT 宏【英文标题】:Qt, "no such signal" runtime error from child class, having Q_OBJECT macro 【发布时间】: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:省略限定名解决了它!谢谢! 【参考方案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,改正后效果很好。

【讨论】:

以上是关于Qt,来自子类的“没有这样的信号”运行时错误,具有 Q_OBJECT 宏的主要内容,如果未能解决你的问题,请参考以下文章

QObject::connect: 没有这样的信号错误 C++

QObject::connect: 没有这样的信号运行时警告 - 找不到原因

来自 Qt 文件的编译时错误:在 ')' 标记之前预期的 unqualified-id

链接来自另一个文件的函数时,Qt 上出现错误 LNK 2019 [重复]

当连接类型 = Qt.DirectConnection 时,来自线程对象的 PyQt5 信号会导致段错误

QObject::connect: 没有这样的信号