信号与槽
发表于:2024-12-26 | 分类: qt
字数统计: 762 | 阅读时长: 3分钟 | 阅读量:

信号与槽

概念语法

概念

  • 信号:组件的行为。如按键的点击click()就是信号,按压、释放等。

  • 槽:信号触发的函数

  • 连接:信号需要与槽连接才能触发

  • 信号和槽是对象间的通信(如按键和窗口)
  • 支持相同信号多槽,按连接顺序触发

连接语法

connect函数,参数:信号控件 信号 接受信号的对象 槽函数

1
2
3
4
5
6
7
8
9
10
11
12
// 写法1,Qt 4 及之前
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

// 写法2 Qt 5+ 推荐写法,SenderClass是信号发起者的类(继承QObject,如QPushButton)
connect(sender, &SenderClass::signalName, receiver, &ReceiverClass::slotName);

// 写法3 ,多控件使用同一个槽函数,根据组件执行不同的逻辑
connect(sender, &SenderClass::signalName, this, [=]() {
// 动态获取发送者对象并处理
QObject *obj = sender();
qDebug() << "Signal sent by:" << obj->objectName();
});
1
2
3
4
5
// 案例 1
connect(ui->radioBlack,SIGNAL(clicked()), this, SLOT(do_setFontColor()));

// 案例2
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:
// designer自动声明和实现的槽函数
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; }

// 按键槽函数(designer自动声明和实现)
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:
// designer自动声明和实现的槽函数
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; }

// 按键槽函数(designer自动声明和实现)
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++");
}
}

上一篇:
事件
下一篇:
qt程序执行过程.md