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

如何通过QSignalMapper与QObject::connect正确放置mySlot槽函数

QSignalMapper槽函数定义与参数传递问题解答

你现有代码的核心问题是connect时将信号接收对象传参为0(空指针),这是无法触发槽函数的——Qt的槽函数不能定义在全局或main函数内,必须依附于一个合法的、继承自QObject的类实例。

槽函数的正确定义位置

  • 槽函数必须定义在添加了Q_OBJECT宏、继承自QObject的自定义类中,用旧版字符串连接语法时,槽函数需要声明在slots访问块下。
  • 最简接收类示例:
#include <QObject>
#include <QDebug>

class SlotReceiver : public QObject
{
    Q_OBJECT // 必须添加该宏,否则Qt元对象系统无法识别槽函数
public:
    explicit SlotReceiver(QObject *parent = nullptr) : QObject(parent) {}

public slots:
    // 你的槽函数在这里实现
    void mySlot(int passedValue) {
        qDebug() << "成功接收到传递的参数:" << passedValue;
        // 在这里编写参数对应的业务逻辑即可
    }
};

代码修正方案

你需要在main函数中实例化上述接收类的对象,替换原来connect里的空指针参数,才能让信号正确路由到槽函数,实现prova值的传递:

int main(int argc, char** argv)
{
    QApplication app(argc, argv); // Qt GUI程序必须实例化QApplication
    // ... 你的按钮but初始化逻辑,例如QPushButton *but = new QPushButton("点击测试");
    
    QSignalMapper *mapper = new QSignalMapper(nullptr);
    // 实例化槽函数所在的接收对象
    SlotReceiver *receiver = new SlotReceiver;
    // 修正connect参数:原来的0替换为实际的接收对象receiver
    QObject::connect(mapper, SIGNAL(mapped(int)), receiver, SLOT(mySlot(int)));

    int prova = 11;
    mapper->setMapping(but, prova);
    QObject::connect(but, SIGNAL(clicked()), mapper, SLOT(map()));
    
    // 其他业务逻辑
    return app.exec();
}

更简便的替代方案(Qt5及以上版本推荐)

Qt5之后支持lambda表达式作为槽的承接,完全可以不用QSignalMapper,代码更简洁,也不需要单独写接收类:

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    // ... 按钮but初始化
    int prova = 11;
    // 直接连接clicked信号到lambda,值捕获prova即可
    QObject::connect(but, &QPushButton::clicked, [prova](){
        qDebug() << "获取到prova的值:" << prova;
        // 直接写点击后的业务逻辑即可
    });

    // 其他业务逻辑
    return app.exec();
}

注意:如果用lambda引用捕获局部变量,要保证变量生命周期长于按钮的点击触发周期,避免野引用问题。

内容的提问来源于stack exchange,提问作者Pola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:24:08