信号与槽
概念语法
概念
- 信号和槽是对象间的通信(如按键和窗口)
- 支持相同信号多槽,按连接顺序触发
连接语法
connect函数,参数:信号控件 信号 接受信号的对象 槽函数
1 2 3 4 5 6 7 8 9 10 11 12
| connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
connect(sender, &SenderClass::signalName, receiver, &ReceiverClass::slotName);
connect(sender, &SenderClass::signalName, this, [=]() { QObject *obj = sender(); qDebug() << "Signal sent by:" << obj->objectName(); });
|
1 2 3 4 5
| connect(ui->radioBlack,SIGNAL(clicked()), this, SLOT(do_setFontColor()));
connect(button, &QPushButton::clicked, this, &MyClass::onButtonClicked);
|
注意:
- 使用designer创建的,连接在setuoUI()中自动完成
- 自定义则在该函数使用后自行连接(该函数由UIC生成,我们不修改)
designer
- 控件和右键->槽
- mainwindow.cpp中实现具体的方法逻辑就行,其他都是自动生成的

mainwindow.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE
class MainWindow : public QMainWindow { Q_OBJECT
public: MainWindow(QWidget *parent = nullptr); ~MainWindow();
private slots: void on_pushButton_clicked();
private: Ui::MainWindow *ui; }; #endif
|
mainwindow.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include "mainwindow.h" #include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); }
MainWindow::~MainWindow() { delete ui; }
void MainWindow::on_pushButton_clicked() { if (ui->pushButton->text() == "Hello") { ui->pushButton->setText("World"); } else { ui->pushButton->setText("Hello"); } }
|
自定义槽函数
ui控件,不需要右键槽
mainwindow.h中private slots部分自定义槽函数(void 随便名字)
mainwindow.cpp中实现该函数(可以在mainwindow.h中点击该函数,右键->重构->添加,快速生成)
顶部构造函数ui->setupUi(this)后自己连接信号和槽

mainwindow.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE
class MainWindow : public QMainWindow { Q_OBJECT
public: MainWindow(QWidget *parent = nullptr); ~MainWindow();
private slots: void on_pushButton_clicked();
void on_my_button_clicked();
private: Ui::MainWindow *ui; }; #endif
|

mainwindow.cpp
- 不要忘记手动连接信号和槽
- 控件名字不认识,在ui_mainwindow.h中去找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include "mainwindow.h" #include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this);
connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::on_my_button_clicked); }
MainWindow::~MainWindow() { delete ui; }
void MainWindow::on_pushButton_clicked() { if (ui->pushButton->text() == "Hello") { ui->pushButton->setText("World"); } else { ui->pushButton->setText("Hello"); } }
void MainWindow::on_my_button_clicked() { if (ui->pushButton_2->text() == "C++") { ui->pushButton_2->setText("JAVA"); } else { ui->pushButton_2->setText("C++"); } }
|

