如何通过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
相关产品推荐
相关产品推荐

