当使用ui设计器设计界面时,可以用on_控件名_signal()直接将信号和槽函数连接,例如实现一个PushButton按钮点击退出功能:
//.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
private slots:
void on_PushButton_clicked();
};
#endif // WIDGET_H
//.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_PushButton_clicked()
{
close();
}
这里直接在类头文件声明槽函数void on_PushButton_clicked();然后在cpp文件中实现。当PushButton被点击时,自动触发槽函数on_PushButton_clicked()。
但是当我不用ui设计器,用手写代码写一个一样的代码时,这样的方法却触发不了槽函数。这是为什么呢?
经过对ui文件的分析,发现有一条这样的语句:
QMetaObject::connectSlotsByName(Widget);
原来这就是on_PushButton_clicked()这种写法能触发的原因。
在手写代码加上这条语句后实现了信号槽的连接,点击PushButton关闭窗体。
//.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
QPushButton* pExitButton = nullptr;
private slots:
void on_pExitButton_clicked();
};
#endif // WIDGET_H
//.cpp
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
pExitButton = new QPushButton(this);
pExitButton->setObjectName("pExitButton");
pExitButton->setFixedSize(250,48);
pExitButton->setText("退出");
//connect(pExitButton,&QPushButton::clicked,this,&Widget::on_pExitButton_clicked);
QMetaObject::connectSlotsByName(this);
}
Widget::~Widget()
{
}
void Widget::on_pExitButton_clicked()
{
close();
}