Qt信号槽连接成功但槽函数未触发的问题及修改方案
Qt信号槽连接有效但槽未触发的问题解决
问题代码
以下是出现问题的代码,信号槽连接返回true但槽函数始终未执行:
main.cpp
#include <QApplication> #include "window.h" int main(int argc, char* argv[]) { QApplication app(argc, argv); Window win; return app.exec(); }
window.h
#ifndef WINDOW_H #define WINDOW_H #include <QDebug> #include "intermediary.h" class Window : public QObject { Q_OBJECT; public: Window() { QObject::connect(&s, &Signal::a_signal, this, &Window::slotTest); Intermediary i; } public slots: void slotTest() { qDebug() << "slot called"; } private: Signal s; }; #endif // WINDOW_H
intermediary.h
#ifndef INTERMEDIARY_H #define INTERMEDIARY_H #include "Signal.h" struct Intermediary { Intermediary() { Signal s; s.sendSignal(); } }; #endif // INTERMEDIARY_H
signal.h
#ifndef SIGNAL_H #define SIGNAL_H #include <QObject> class Signal : public QObject { Q_OBJECT; signals: void a_signal(); public: Signal() {} void sendSignal() { emit a_signal(); } }; #endif // SIGNAL_H
问题原因
核心问题是对象实例不匹配:
- Window类中与槽函数建立连接的是成员变量
Signal s,这是一个有效实例。 - 但Intermediary构造函数里创建了一个局部Signal对象
s,这是完全独立的另一个实例。调用该局部对象的sendSignal()时,触发的是它自身的a_signal信号,和Window中已连接槽的Signal实例毫无关联,因此槽函数不会被触发。 - 同时,这个局部Signal对象会在Intermediary构造函数执行完毕后立即销毁,即便有延迟触发逻辑也无法生效。
修改方案(保留Intermediary结构)
只需让Intermediary使用Window中已连接槽的Signal实例,而非自行创建新实例:
1. 修改Intermediary的构造函数,接收Signal引用
// intermediary.h #ifndef INTERMEDIARY_H #define INTERMEDIARY_H #include "Signal.h" struct Intermediary { // 接收外部Signal对象的引用 Intermediary(Signal& targetSignal) { targetSignal.sendSignal(); } }; #endif // INTERMEDIARY_H
2. 在Window构造函数中传入自身的Signal成员
// window.h #ifndef WINDOW_H #define WINDOW_H #include <QDebug> #include "intermediary.h" class Window : public QObject { Q_OBJECT; public: Window() { QObject::connect(&s, &Signal::a_signal, this, &Window::slotTest); // 将已连接槽的Signal成员传入Intermediary Intermediary i(s); } public slots: void slotTest() { qDebug() << "slot called"; } private: Signal s; }; #endif // WINDOW_H
修改后,Intermediary触发的就是Window中已绑定槽函数的Signal实例的信号,槽函数会被正常调用。
内容的提问来源于stack exchange,提问作者Proxy
相关产品推荐
相关产品推荐

