0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Qt编程基础之信号与槽机制

我快闭嘴 来源:嵌入式攻城狮 作者:嵌入式攻城狮 2022-09-06 13:01 次阅读

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 里有大量自定义好的信号与槽, 基本够我们使用。若没有找到想要的信号与槽,就需要定义自己的信号和槽了

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

#include 
#include 

class MainWindow : public QMainWindow
{
  Q_OBJECT

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

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

#include 
#include 

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()槽函数实现文本的切换

651517d0-2d9a-11ed-ba43-dac502259ad0.png

6532107e-2d9a-11ed-ba43-dac502259ad0.png

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 信号
    +关注

    关注

    11

    文章

    2771

    浏览量

    76521
  • 编程
    +关注

    关注

    88

    文章

    3558

    浏览量

    93524
  • Qt
    Qt
    +关注

    关注

    1

    文章

    301

    浏览量

    37772

原文标题:Qt开发中的信号与槽机制

文章出处:【微信号:嵌入式攻城狮,微信公众号:嵌入式攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Qt信号机制(一)

    一. 简介就我个人来理解,信号机制与Windows下消息机制类似,消息机制是基于回调函数,Qt
    发表于 11-07 15:06

    Qt信号例子(二)

    ))); } //实现用于接受pb点击信号void MyMainWindows::SlotTest(){label->setText("clicked");//发送自定义的信号,请注意信号
    发表于 11-07 15:13

    QT自动链接信号机制

    name中的信号signal name和这个void on__()链接起来。这是QT不需要connect语句就可以自动链接信号
    发表于 11-13 09:17

    【NanoPi M1 Plus试用体验】【结项】-基于Qt环境下的FTP服务工具开发

    Designer进行界面设计,由一个主界面和三个子界面组成。(3)添加代码 建立信号函数映射机制信号
    发表于 06-08 14:51

    请问Qt编程信号信号处理程序的使用方法?

      信号作为Qt的和新机制,在Qt编程中有着非常广泛的应用。  事实上,我们在
    发表于 11-20 08:03

    信号是如何实现连接的呢

    1.的连接过程分析Unix Signal产生者(键盘) --> 绑定[signal(id,某函数())] --> 接受者(“.c文件中的函数处理”)Qt 信号产生者(按钮等
    发表于 01-18 09:48

    基于Qt的遥控式设备控制的设计与实现

    采用Qt 的一次编写多处编译运行机制和其强大的信号机制,首先基于Qt 设计了遥控式控制设备的
    发表于 08-17 08:37 14次下载

    Qt与Matlab混合编程

    Qt与Matlab混合编程
    发表于 03-27 08:48 0次下载

    Qt图形编程基础使用Qt编写“Hello,World”程序实验

    分享到:标签:Qt图形编程 Linux 操作系统 12.3 实验内容使用Qt编写Hello,World程序 1.实验目的 通过编写一个跳动的Hello,World字符串,进一步熟悉嵌入式Qt
    发表于 10-18 14:44 1次下载
    <b class='flag-5'>Qt</b>图形<b class='flag-5'>编程</b>基础<b class='flag-5'>之</b>使用<b class='flag-5'>Qt</b>编写“Hello,World”程序实验

    基于Qt组件的俄罗斯方块设计

    QT框架是诺基亚开发的一款跨平台C++图形用户界面,允许真正的组件编程、易扩展。信号是一种高级接口,应用于对象间的通信,是QT的核心。很
    发表于 11-15 15:16 9次下载

    Embeded linuxQt gdb

    Embeded linuxQt gdb
    发表于 05-15 13:52 1290次阅读
    Embeded linux<b class='flag-5'>之</b><b class='flag-5'>Qt</b> gdb

    一文详解Qt信号函数机制

    信号用于多个对象之间的通信。信号机制Qt的核心特性,也是
    的头像 发表于 02-07 09:14 3032次阅读

    Qt“懒人写法”之一键破“

    在《Qt信号函数机制,此篇足矣》一文中已经描述了Qt信号
    的头像 发表于 02-09 17:23 912次阅读

    Qt“灵魂”Meta-Object系统

    Meta-Object即是Qt的元对象系统,下文都以元对象系统进行描述。在Qt中,具有标志性特征的则是信号函数机制,该
    的头像 发表于 02-10 13:50 1756次阅读

    详细介绍Qt信号交流机制

    PyQT5中QGUI中当用户改动一个QWidget的状态时,可以通过支持的信号触发相关的函数完成动作交互。
    的头像 发表于 02-21 09:35 1069次阅读