简介
在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_OBJECT
public:
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() 槽函数将被调用,输出槽函数的名称和行号到调试控制台,并显示一个消息框。