Qt中如何为QPushButton绑定点击事件实现点击修改按钮文本
问题根源
你使用Qt传统SIGNAL()/SLOT()宏语法绑定信号槽时,违反了该语法的参数匹配规则:
QPushButton的clicked()信号是无参数的- 传统信号槽语法要求槽函数的参数列表必须和信号的参数列表严格对应,不允许在
SLOT()宏中直接给槽函数传入固定参数,你写的SLOT(setText("Change Success"))是无效写法,Qt在运行时会找不到匹配的槽函数,所以绑定失效。
解决方法
方法1:使用Qt5+支持的函数指针+Lambda语法(推荐)
这种语法不需要严格参数匹配,支持直接在Lambda中写业务逻辑,替换原有的connect行即可:
QObject::connect(login, &QPushButton::clicked, login, [=](){ login->setText("Change Success"); });
修改后完整可运行代码:
#include <QApplication> #include <QWidget> #include <QPushButton> #include <QVBoxLayout> #include <QObject> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget *window = new QWidget; window->setWindowTitle("Pandora"); window->setFixedSize(640, 360); QVBoxLayout *layout = new QVBoxLayout(window); QPushButton *login = new QPushButton; login->setText("Login"); // 修改后的信号槽绑定逻辑 QObject::connect(login, &QPushButton::clicked, login, [=](){ login->setText("Change Success"); }); layout->addWidget(login); window->show(); return app.exec(); }
方法2:保留传统SIGNAL/SLOT语法
需要自定义继承QObject的类,声明无参的自定义槽函数,在槽函数内部调用setText(),再将clicked()信号绑定到这个自定义槽函数上即可。
内容的提问来源于stack exchange,提问作者yui amanda
相关产品推荐
相关产品推荐

