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 [重复]