You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:25:23