嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > Qt开发中的信号与槽机制

Qt开发中的信号与槽机制

点击下方名片关注公众号

1. 信号与槽机制

信号与槽(Signal & Slot)是Qt编程的基础,因为信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。信号是在特定情况下被发射的事件,槽就是对信号响应的函数。信号与槽关联是用QObject::connect()函数实现的,其基本格式是:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

connect()是QObject类的一个静态函数,而QObject是所有Qt类的基类,在实际调用时可以忽略前面的限定符,所以可以直接写为:

connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
//sender:发射信号的对象
//signal():是信号名称。信号可以看做是特殊的函数, 需要带括号,有参数时还需要指明参数。
//receiver:接收信号的对象
//slot():槽函数的名称,需要带括号,有参数时还需要指明参数。

SIGNAL和SLOT是Qt的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串。也可以不使用这两个宏,而使用双引号代替:

connect(sender, "signal()", receiver, "slot()");


2. 信号与槽的连接方式

在使用信号与槽的类中,必须在类的定义中加入宏Q_OBJECT。当一个信号被发射时,与其关联的槽函数会被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码

⏩ 一个信号连接多个槽

connect(pushButton, SIGNAL(clicked()), this, SLOT(hide());
connect(pushButton, SIGNAL(clicked()), this, SLOT(close());

⏩ 多个信号连接一个槽

connect(pushButton1, SIGNAL(clicked()), this, SLOT(close()));
connect(pushButton2, SIGNAL(clicked()), this, SLOT(close()));
connect(pushButton3, SIGNAL(clicked()), this, SLOT(close()));

⏩ 一个信号连接另一个信号

connect(pushButton, SIGNAL(objectNameChanged(QString)),this, SIGNAL(windowTitelChanged(QString)));


3. 信号与槽的创建

Qt 里有大量自定义好的信号与槽, 基本够我们使用。若没有找到想要的信号与槽,就需要定义自己的信号和槽了

⏩ 创建信号:在mainwindow.h里声明信号即可,无需定义#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

signals
:
/* 声明一个信号,只需声明,无需定义 */
void pushButtonTextChanged();
};
#endif
⏩ 创建槽:在mainwindow.h里声明槽,在mainwindow.cpp里实现槽的定义/***** 在 mianwindow.h 里直接声明槽 *****/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>

classMainWindow:public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent =nullptr);
~MainWindow();

signals
:     //声明一个信号,只需声明,无需定义
voidpushButtonTextChanged();

public slots:
voidchangeButtonText();    //声明切换文本槽函数
voidpushButtonClicked();   //声明按钮点击槽函数

private:
QPushButton
*pushButton; //声明对象
};
#endif

/***** 在 mianwindow.cpp 里实现槽的定义 *****/
/* 实现按钮点击槽函数 */
void MainWindow::pushButtonClicked()
{
emit pushButtonTextChanged(); //使用emit发送信号
}

/* 实现按钮文本改变的槽函数 */
void MainWindow::changeButtonText()
{
pushButton->setText("I was clicked!");
}

⏩ 信号与槽的连接:在mainwindow.cpp中连接信号与槽

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->resize(800,480);
pushButton = new QPushButton(this);   //实例化按钮对象
pushButton->setText("I am a Button"); //设定按钮的文本
/* 信号与槽连接 */
connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
connect(this, SIGNAL(pushButtonTextChanged()), this, SLOT(changeButtonText()));
}

上面代码编译运行后如下图示,点击按钮后,pushButtonClicked()槽函数被触发运行,从而emitpushButtonTextChanged()信号,进而触发changeButtonText()槽函数实现文本的切换


往期推荐

● 

● 

● 

● 

● 

● 

● 

扫二维码|关注我们

微信号|andyxi_linux

专注于嵌入式开发技术

分享、在看与点赞

只要你点,我们就是胖友