linux系统中QT里面信号与槽的实现方法

news2024/12/23 14:33:34

        大家好,今天主要来聊一聊,QT中信号与槽的使用方法。

目录

第一:QT中信号与槽简介

第二:如何在项目里创建信号

第三:如何在项目中创建槽

第四:项目中连接信号与槽


第一:QT中信号与槽简介

        在学习Qt的过程中,信号与槽是必不可少的部分,也是QT编程的基础。后面进行QT信号与槽开发的时候,统一采用代码绘制界面,可以锻炼我们的布局能力,和代码逻辑能力。

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

        信号就是在特定情况下被发射的事件,例如PushButton最常见的信号就是鼠标点击时发射的clicked()信号等。

        GUI程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。

        槽(Slot)就是对信号响应的函数。槽函数是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public\private或protected),可以具有任何参数,也可以直接被调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

        信号与槽关联是用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()是槽函数的名称,需要带括号,有参数时还需要指明参数。

第二:如何在项目里创建信号

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

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
signals:
    //声明一个信号,只需要声明,无需定义
    void pushButtonTextChanged();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

第三:如何在项目中创建槽

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

槽有以下特点:
        1. 槽可以是任何成员函数、普通全局函数、静态函数
        2. 槽函数和信号的参数和返回值要一致
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QPushButton>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
signals:
    //声明一个信号,只需要声明,无需定义
    void pushButtonTextChanged();

private slots:
    void on_pushButton_clicked();
    
    //声明一个槽函数
    void changeButtonText();
    //声明按钮点击的槽函数
    void pushButtonClicked();

private:
    Ui::MainWindow *ui;
    //声明一个对象pushButton
    QPushButton *pushButton;
};

#endif // MAINWINDOW_H

第四:项目中连接信号与槽

派生类::派生类构造函数(总参数列表):基类构造函数(参数列表)  //基类构造函数的参数列表是实参。
{
派生类中的数据成员初始化;

}

信号槽连接的代码如下。

connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
connect(this, SIGNAL(pushButtonTextChanged()), this, SLOT(changeButtonText()));
具体代码实现如下:
#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()槽实现响应的动作(事件)。最终的实现效果是按钮的文本由“我是一个按钮”被点击时变成“被点击 了!”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

遥感图像处理:最小噪声分离变换(Minimum Noise Fraction Rotation,MNF Rotation)

遥感图像处理&#xff1a;最小噪声分离变换&#xff08;Minimum Noise Fraction Rotation&#xff0c;MNF Rotation1.PCA变换2.MNF3.PCA和MNF1.PCA变换 在统计学中&#xff0c;主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中…

Django使用Celery异步发送短信(Django4.1.3+Celery5.2.7+ubuntu)

首先要下载Celery&#xff0c;直接pip就好 我的redis配置 CACHES {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://192.168.2.128:6379/0","OPTIONS": {"CLIENT_CLASS"…

自动化测试Seleniums~2

webdriver API 1.如何打开网页以及如何关闭一个浏览器。 package test_20230107;import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver;import static java.lang.Thread.sleep;public class Test {public static void main(String[] args)…

JavaEE多线程-线程的状态和安全问题

目录一、线程中的基本状态二、线程安全问题三、线程安全的标准类四、synchronized 关键字-监视器锁monitor locksynchronized 的特性五、volatile 关键字一、线程中的基本状态 NEW: 安排了工作, 还未开始行动, 就是创建了Thread对象, 但还没有执行start方法(内核里面还没有创建…

SpringSecurity(十一)【跨域】

十一、跨域 简介 跨域问题实际应用开发中的一个非常常见的需求&#xff0c;在 Spring 框架中对于跨域问题的处理方案有好几种&#xff0c;引入了 Spring Security 之后&#xff0c;跨域问题的处理方案又增加了 什么是 CORS CORS&#xff08;Cross-Origin Resource-Sharing&…

联合证券|重磅数据出炉,道指飙涨700点!美股新年首周“开门红”!

美股涨嗨了&#xff01; 当地时间1月6日&#xff0c;最新发布的美国12月非农工作陈述显现&#xff0c;美国工作市场终于呈现降温迹象&#xff0c;过去一年的激进加息成效初显。受此提振&#xff0c;美股三大股指高开高走&#xff0c;彻底改变前几日的跌势。从周k线看&#xff…

PCB结构和谐振(三)

PCB结构和谐振&#xff08;一&#xff09;PCB结构和谐振&#xff08;二&#xff09;仿真研究在本节中&#xff0c;我们首先对玻璃束的随机分布进行了简单的模拟研究。然后我们利用这些实验结论来简化常用的玻璃布3D结构。最后&#xff0c;这种简化的结构用于研究复杂层压板和两…

Java设计模式中原型模式是啥/浅克隆与深克隆又是什么/clone方法怎么回事

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 4.5 原型模式 4.5.1 概述 用已创建实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象一样的新对象 4.5.2 结构 抽象原型类&#xff1a;规定具体…

Docker系列 深度使用nextcloud(九) 硬盘挂载

转自我的个人博客https://blognas.hwb0307.com&#xff0c;该文的内容更新仅在个人博客可见。欢迎关注&#xff01; 前言 基于《Docker系列 搭建个人云盘服务nextcloud》&#xff0c;相信无论是在有/无443端口的Linux机子里均可成功安装Nextcloud。值得一提的是&#xff0c;Ne…

02、做点准备工作 osg\openscenegraph源代码下载 C++三维视频融合实战系列(时空克隆)

首先&#xff0c;要有一点C编程基础&#xff0c;熟悉VS2013开发环境。 在开始实践之前&#xff0c;先要搭建号VS2013开发环境。 然后&#xff0c;建议电脑安装windows 10 64位操作系统。 接下来需要在以下地址下载开源代码&#xff1a; 1、osg下载 打开openscenegraph主页…

CSS权威指南(七)视觉格式化

文章目录1.盒模型2.元素的显示方式3.行内元素1.盒模型 不管是什么元素,CSS都假定每个元素会生成一个或多个矩形框,我们称之为元素。各元素框的中心是内容区域&#xff0c;四周有可选的内边距、边框、轮廓和外边距。默认情况下&#xff0c;内容区的背景出现在内边距范围内。外边…

5分钟搞懂用户态,内核态

5分钟搞懂用户态,内核态 1. 什么是用户态,内核态 用户态就是提供应用程序运行的空间&#xff0c;为了使应用程序访问到内核管理的资源例如CPU&#xff0c;内存&#xff0c;I/O。内核必须提供一组通用的访问接口&#xff0c;这些接口就叫系统调用。 用户态&#xff0c;内核态…

进制详解:二进制、八进制和十六进制

进制详解&#xff1a;二进制、八进制和十六进制 背景&#xff08;Contexts&#xff09; 我们平时使用的数字都是由 0~9 共十个数字组成的&#xff0c;例如 1、9、10、297、952 等&#xff0c;一个数字最多能表示九&#xff0c;如果要表示十、十一、二十九、一百等&#xff0c;…

机器学习笔记之深度信念网络(一)背景介绍与模型表示

机器学习笔记之深度信念网络——背景介绍与模型表示引言深度信念网络场景构建深度信念网络的联合概率分布引言 从本节开始&#xff0c;将介绍深度信念网络。 深度信念网络 深度信念网络(Deep Belief Network,DBN)是杰弗里辛顿(Geoffrey Hinton)于2006年提出的模型&#xff0…

Day853.WorkerThread模式 -Java 性能调优实战

WorkerThread模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于WorkerThread模式的内容。 Thread-Per-Message 模式&#xff0c;对应到现实世界&#xff0c;其实就是委托代办。这种分工模式如果用 Java Thread 实现&#xff0c;频繁地创建、销毁线程非常影响性能…

场景编程集锦 - 吉米的总统梦想

1. 场景描述 吉米是太平洋岛国一个贫苦家庭的孩子&#xff0c;他的梦想就是当总统&#xff0c;引领国家走向富强之路。 开学的第一堂课上&#xff0c;老师用白色的粉笔在黑板上写下了“我的梦想”&#xff0c;同学们都陷入了思考。大卫的梦想是当一名科学家&#xff0c;用奇思妙…

CSS初级教程(文本)【第六天】

文章目录【1】CSS 文本[字体颜色|背景色]【2】CSS 文本对齐【3】CSS 文字装饰【4】CSS 文本转换[大写或小写]【5】CSS 文字间距【6】CSS 文本阴影【7】所有 CSS 文本属性CSS上回学习链接 CSS初级教程 颜色【第一天】 CSS初级教程 背景【第二天】 CSS初级教程 边框【第三天】 CS…

Windows访问控制 -- SID

Windows访问控制是一个比较大的题目&#xff0c;因此计划用一系列的文章简单谈一下这个。本篇是开篇&#xff0c;介绍SID。 Windows访问控制定义 Windows访问控制的含义可以参考MSDN的描述&#xff1a;Access control refers to security features that control who can acce…

Java集合容器介绍

Java 容器分为 Collection 和 Map 两大类&#xff0c;其下又有很多子类&#xff0c;如下所示&#xff1a; Collection接口&#xff1a;单列数据&#xff0c;定义了存取一组对象的方法的集合 1、List&#xff1a;元素有序(指的是存储时&#xff0c;与存放顺序保持一致)、可重复的…

【Docker】(四)使用volume持久化Docker容器中的Redis数据

1.前言 本系列文章记录了从0开始学习Docker的过程&#xff0c;Docker系列历史文章&#xff1a; &#xff08;一&#xff09;基本概念与安装使用 &#xff08;二&#xff09;如何使用Docker发布一个SpringBoot服务 &#xff08;三&#xff09;使用registry远程镜像仓库管理镜像…