简介
在Qt中,QMetaObject::connectSlotsByName 是一个便利的方法,它可以根据对象的对象名(objectName)自动将信号和槽连接起来。但是,要使用这个方法,必须确保:
1 控件(如按钮)有一个设置好的对象名(objectName)。
2 槽函数的命名遵循一定的规则,即槽函数名必须以 on_<objectName>_<signalName>() 的形式命名。
测试代码
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>
#include <QDebug>
#include <QMessageBox>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr): QWidget(parent){button = new QPushButton(this);button->setText("button");button->setObjectName("button");button->setGeometry(5,5,120,20);QMetaObject::connectSlotsByName(this);}~Widget(){}
private:QPushButton *button;
private slots:void on_button_clicked(){qDebug() << __func__ << __LINE__;QMessageBox::information(this,"button","clicked");}
};
#endif // WIDGET_H
注意几个关键点:
button->setObjectName("button"); 设置了按钮的对象名为 "button"。
QMetaObject::connectSlotsByName(this); 应该传入 this 指针,因为槽函数是在 Widget 类中定义的。这意味着 Qt 会在 Widget 对象中查找名为on_<objectName>_<signalName>() 的槽函数。
这样,当按钮被点击时,on_button_clicked() 槽函数将被调用,输出槽函数的名称和行号到调试控制台,并显示一个消息框。