嵌入式QT (Qt 信号与槽)

这篇具有很好参考价值的文章主要介绍了嵌入式QT (Qt 信号与槽)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Qt 信号与槽机制

因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。

信号(Signal)就是在特定情况下被发射的事件。
GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。
(Slot)就是对信号响应的函数。槽就是一个函数,与一般的 C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:

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

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

关于信号与槽的使用,有以下一些规则需要注意:
一个信号可以连接多个槽,例如:

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

这是当一个对象 pushButton 的被单击时,所在窗体有两个槽进行响应,一个 hide()用于隐藏主窗体,一个 close 用于关闭主窗体。

多个信号可以连接同一个槽,如下:

connect(pushButton,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_2,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_3,SIGNAL(clicked()),this,SLOT(close()));

这样,当任何一个 pushButton 被单击时,都会执行 close()函数,进而关闭或者退出程序。

一个信号可以连接另外一个信号(说明了 connect 万物皆可连,非常好用!),例如:

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

这样,当一个信号发射时,也会发射另外一个信号,实现某些特殊的功能。

在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT(特别重要)。

当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

总结如下图,可以看到发送者与发送的信号是在一起的,接收者与接收的信号/槽是在一起的。它们不能在 connect()方法里写乱顺序!由发送者发送出信号到接收者用信号/槽接收。
嵌入式QT (Qt 信号与槽)
disconnect(),这个方法重载了好几个函数,解开格式如
下。

bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)

1、断开一切与 myObject 连接的信号或槽。

disconnect(myObject, 0, 0, 0);

相当于非静态重载函数:

myObject->disconnect();

2、断开所有连接到特定信号的东西。

disconnect(myObject, SIGNAL(mySignal()), 0, 0);

相当于非静态重载函数:

myObject->disconnect(SIGNAL(mySignal()));

3、与指定的接收者断开连接。

disconnect(myObject, 0, myReceiver, 0);

相当于非静态重载函数:

myObject->disconnect(myReceiver);

二、 如何在项目里创建信号

由于信号只需声明,无需定义。所以我们只需要在 mianwindow.h 里声明信号即可。代码如下,如下图黑色加粗部分代码就是创建的信号。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
/* 引入 QPushButton */
#include <QPushButton>

class MainWindow : public QMainWindow
{
	Q_OBJECT
	
public:
	MainWindow(QWidget *parent = nullptr);
	~MainWindow();
	
signals:
	/* 声明一个信号,只需声明,无需定义 */
	void pushButtonTextChanged();

};
#endif // MAINWINDOW_H

三、如何在项目中创建槽

创建槽的方法也很简单,也是直接在 mianwindow.h 里直接声明槽,在 mianwindow.cpp 里实现槽的定义,声明槽必须写槽的定义(定义指函数体的实现),否则编译器编译时将会报错。

槽有以下特点:

  1. 槽可以是任何成员函数、普通全局函数、静态函数
  2. 槽函数和信号的参数和返回值要一致

根据上面的槽特点,由于我们在第二小节里声明了信号void pushButtonTextChanged();所以我们声明的槽函数必须是无返回值类型void,和无需参数。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
/* 引入 QPushButton */
#include <QPushButton>

class MainWindow : public QMainWindow
{
	Q_OBJECT
	
public:
	MainWindow(QWidget *parent = nullptr);
	~MainWindow();
	
	
signals:
	/* 声明一个信号,只需声明,无需定义 */
	void pushButtonTextChanged();
	
public slots:
	/* 声明一个槽函数 */
	void changeButtonText();
	
	/* 声明按钮点击的槽函数 */
	void pushButtonClicked();
	
private:
	/* 声明一个对象 pushButton */
	QPushButton *pushButton;
};
#endif // MAINWINDOW_H

在 mainwindow.cpp 里实现 声 明 的 槽 函 数 void changeButtonText();voidpushButtonClicked();。同时还实例化了 pushButton 对象。代码如下。

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
	/* 设置窗体的宽为 800,高为 480 */
	this->resize(800,480);
	
	/* 实例化 pushButton 对象 */
	pushButton = new QPushButton(this);
	
	/* 调用 setText()方法设定按钮的文本 */
	pushButton->setText("我是一个按钮");
}

MainWindow::~MainWindow()
{

}

/* 实现按钮点击槽函数 */
void MainWindow::pushButtonClicked()
{
	/* 使用 emit 发送信号 */
	emit pushButtonTextChanged();
}

/* 实现按钮文本改变的槽函数 */
void MainWindow::changeButtonText()
{
	/* 在槽函数里改变按钮的文本 */
	pushButton->setText("被点击了!");
}

四、 如何在项目中连接信号与槽

信号槽连接的代码如下。

connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
connect(this, SIGNAL(pushButtonTextChanged()), this, SLOT(changeButtonText()));

注意,发送信号的对象,和接收的信号的对象。因为我们 pushButtonClicked()是本类里定义的槽,所以用 this 来接收。同理,pushButtonTextChanged()也是本类定义的信号。所以发送者写成 this。changeButtonText()也是本类的槽函数,所以接收槽的对象也是 this。

在 mainwindow.cpp 中信号槽连接的代码如下。

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
 : QMainWindow(parent)
{
	/* 设置窗体的宽为 800,高为 480 */
	this->resize(800,480);
	
	/* 实例化 pushButton 对象 */
	pushButton = new QPushButton(this);
	
	/* 调用 setText()方法设定按钮的文本 */
	pushButton->setText("我是一个按钮");
	
	/* 信号与槽连接 */
	connect(pushButton, SIGNAL(clicked()), this,SLOT(pushButtonClicked()));
	
	connect(this, SIGNAL(pushButtonTextChanged()), this,SLOT(changeButtonText()));
}

MainWindow::~MainWindow()
{

}

/* 实现按钮点击槽函数 */
void MainWindow::pushButtonClicked()
{
	/* 使用 emit 发送信号 */
	emit pushButtonTextChanged();
}

/* 实现按钮文本改变的槽函数 */
void MainWindow::changeButtonText()
{
	/* 在槽函数里改变按钮的文本 */
	pushButton->setText("被点击了!");
}

整个流程就是当点击了按钮,然后触发了 pushButtonClicked()pushButtonClicked()槽里发送 pushButtonTextChanged()信号,changeButtonText()槽响应 pushButtonTextChanged()信号,我们在 changeButtonText()槽实现响应的动作(事件)。最终的实现效果是按钮的文本由“我是一个按钮”被点击时变成“被点击了!”。

五、学会使用 Qt 类的信号与槽

要想使用 Qt 的信号与槽,那么我们必须知道有哪些信号与槽。在 第四节的代码里。

connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));

如下图示,按住 Ctrl 键,再点击 clicked(),进入 clicked()这个信号的定义处。
嵌入式QT (Qt 信号与槽)
进入 QPushButton 的定义处,我们看到 QPushButton 不止 clicked 信号,还有其他信号,也有 QPushButton 的槽函数(返回上一步按 Alt + 方向左键)。在这里我们只是简单的看了如何在已知信号和槽里查找其他信号与槽。实际上在开发中我们经常需要使用 Qt 帮助文档来查看 Qt定义的信号与槽。
嵌入式QT (Qt 信号与槽)文章来源地址https://www.toymoban.com/news/detail-431838.html

到了这里,关于嵌入式QT (Qt 信号与槽)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Qt子窗口给父窗口传值(信号与槽机制)

    Qt子窗口给父窗口传值(信号与槽机制)

    1、父窗口和子窗口名称介绍 父窗口:Test_7 子窗口:testnew 2、父窗口与子窗口内容介绍 子窗口:声明信号、发送信号 父窗口:声明槽函数,定义槽函数,connect连接 3、在父窗口中(Test_7.cpp),完整代码如下: 4、父窗口中(Test_7.h),完整代码如下:  5、子窗口(testnew.cp

    2024年02月11日
    浏览(6)
  • 嵌入式QT- QT使用MQTT

    嵌入式QT- QT使用MQTT

    目录 一、MQTT介绍 二、MQTT概念   2.1 订阅(Subscribtion)   2.2 会话(Session)   2.3 主题名(Topic Name)    2.4 主题筛选器(Topic Filter)    2.5 消息订阅 三、MQTT中的角色 3.1 客户端 3.2 服务器 四、X86平台安装mosquitto 4.1 下载 mosquitto 服务器 4.2 下载 mosquitto 客户端 4.3 mosquitto 命令

    2024年02月13日
    浏览(5)
  • 嵌入式Qt 第一个Qt项目

    嵌入式Qt 第一个Qt项目

    打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项   弹出New Project对话框,选择Qt Widgets Application 选择【Choose】按钮,弹出如下对话框 设置项目名称和路径,按照向导进行下一步   选择编译套件 向导会默认添加一个继承自QMainWindow的类,可

    2024年02月20日
    浏览(8)
  • 【python】软件开发——PyQt5、Qt Designer、信号与槽机制、计算器实现

    【python】软件开发——PyQt5、Qt Designer、信号与槽机制、计算器实现

    PyQt5 是一个基于 Python 的 GUI 框架,用于创建跨平台的桌面应用程序。它是 Qt 库的 Python 绑定,结合了 Python 的简洁和易用性以及 Qt 框架的强大功能。 Qt 是一个流行的 C++ 跨平台应用程序开发框架,提供了丰富的图形界面组件、网络通信、数据库访问、多线程等功能。PyQt5 允许

    2024年02月04日
    浏览(18)
  • 【嵌入式——QT】容器类

    Qt提供了基于模板的容器类,这些容器类可以用于存储指定类型的数据项,Qt的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。它们还是线程安全的,它们作为只读容器时可被多个线程访问。 容器类是基于模板的类,如常用的容器类QList,T是一个具体的类型,可

    2024年02月22日
    浏览(10)
  • 【嵌入式Qt开发入门】初识Qt——Linux下安装Qt

    【嵌入式Qt开发入门】初识Qt——Linux下安装Qt

            Qt 是一个跨平台的 C++开发库。主要用来开发图形用户界面(Graphical User Interface,简 称 GUI)程序。         Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部; Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多

    2024年02月16日
    浏览(31)
  • 嵌入式 QT 界面布局管理

    嵌入式 QT 界面布局管理

    目录 1、实例程序功能 2、界面组件布局 2.1 界面组件的层次关系 2.2 布局管理 2.3 伙伴关系和Tab顺序       创建一个 Widget Application 项目 samp2_2, 在创建窗体时选择基类 QDialog ,生成的类命名为 QWDialog ,并选择生成窗体。     如 此 新建 的项 目 samp2_2 有一 个界 面文 件 qwdi

    2024年02月04日
    浏览(12)
  • lv6 嵌入式开发-Flappy bird项目(信号机制、定时器功能实现)

    lv6 嵌入式开发-Flappy bird项目(信号机制、定时器功能实现)

    目录 1 信号(signal) 2 设置信号响应方式 – signal 3 设置定时器 4 示例 问题: getch()阻塞获取键盘按键输入, 怎么操作才能不影响小鸟下落和管道移动? getch如果阻塞,下面的程序都是无法执行。通过信号机制方式实现。 在Linux中,软中断信号(signal,简称为信号)是在软件层

    2024年02月07日
    浏览(35)
  • 【嵌入式——QT】QStyledItemDelegate用法详解

    【嵌入式——QT】QStyledItemDelegate用法详解

    QStyledItemDelegate是所有Qt item视图的默认委托,在创建它们时就会被安装在它们上面。 QStyledItemDelegate类是模型/视图类之一,是Qt模型/视图框架的一部分。委托允许项目的显示和编辑独立于模型和视图进行开发。 模型中数据项的数据被赋值为ItemDataRole;每个物品可以为每个角色存

    2024年01月23日
    浏览(12)
  • 嵌入式:QT Day2

    嵌入式:QT Day2

    源码: widget.h second.h widget.cpp second.cpp main.cpp    

    2024年02月15日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包