当前位置: 首页 > news >正文

【QT5】<总览二> QT信号槽、对象树及常用函数

文章目录

前言

一、QT信号与槽

1. 信号槽连接模型

2. 信号槽介绍

3. 自定义信号槽

二、QT的对象树

三、添加资源文件

四、样式表的使用

五、QSS文件的使用

六、常用函数与宏


前言

承接【QT5】<总览一> QT环境搭建、快捷键及编程规范。若存在版权问题,请联系作者删除!


一、QT信号与槽

1. 信号槽连接模型

1.1 信号槽连接模型:

1.2 QT中信号槽的使用方式:

方式一:如下图所示,在ui设计器中的中下位置可以设置信号槽的四要素。下图实现了点击按钮就会关闭当前窗口的功能。

方式二:如下图所示,右击按钮,再点击“转到槽”,QT就会给MyWindow类自动在头文件中声明私有的void on_pushButton_clicked(); 同时也会转到源文件要求程序员实现点击的效果。

2. 信号槽介绍

2.1 概念:

  • 信号:在特定情况下被发射的事件。例如:PushButton最常见的信号就是鼠标单击时发射的click()信号。
  • 槽:对信号响应的函数。槽函数与普通的函数相比,不同在于:槽函数与指定的信号关联,当信号被发射时,该槽函数会被自动执行。

2.2 信号与槽的关联:

  • 方式:使用QObject::connect()函数。由于QT中所有类都是QObject的子类,因此可以省去QObject,其基本格式如下:
//sender 是发射信号的对象的名称
//signal() 是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数
//receiver 是接收信号的对象名称
//slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数
//SIGNAL和SLOT是Qt的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
  • 代码示例:
/* 1.mywindow.h头文件代码 */
#ifndef MYWINDOW_H
#define MYWINDOW_H
#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MyWindow; }
QT_END_NAMESPACEclass MyWindow : public QMainWindow
{Q_OBJECTpublic:MyWindow(QWidget *parent = nullptr);~MyWindow();private slots:void pushButton_clicked();//自定义槽函数private:Ui::MyWindow *ui;
};
#endif // MYWINDOW_H/************************************************//* 2.mywindow.cpp代码  */
#include "mywindow.h"
#include "ui_mywindow.h"
#include <QDebug>//MyWindow构造函数的具体实现
MyWindow::MyWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MyWindow)
{ui->setupUi(this);connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(pushButton_clicked()));
}//MyWindow析构函数的具体实现
MyWindow::~MyWindow()
{delete ui;
}//自定义槽函数的实现
void MyWindow::pushButton_clicked()
{static int i;qDebug() << i++ << " ";
}

2.3 信号与槽的解除连接:

  • disconnect(myObject, 0, 0, 0); 断开一切与 myObject 连接的信号或槽。
  • disconnect(myObject, SIGNAL(mySignal()), 0, 0); 断开所有连接到特定信号的东西。
  • disconnect(myObject, 0, myReceiver, 0); 与指定的接收者断开连接。

2.4 信号槽连接规则:

  • 一个信号可以连接多个槽(触发一个造成多个结果)
  • 多个信号可以连接同一个槽(多个触发源造成一个结果)
  • 一个信号可以连接另一个信号(连锁反应)

3. 自定义信号槽

3.1 自定义信号的语法:

//在类中使用signals关键字
//信号函数只声明不定义,并且返回值为void
signals:void sendMessage();//自定义信号函数

3.2 自定义槽的语法:

//使用slots自定义槽
//可以使用C++的三种权限符
//声明后必须给出定义
public slots:void goToClass();//自定义的槽函数//槽函数定义
void Student::goToClass()
{qDebug() << "学生上课!" << endl;
}

3.3 案例:

背景:学校发出通知,学生收到后回到班级上课。根据此情景,创建School和Student类,并且在School类中自定义信号“发出通知”,在Student类中自定义槽“去班级”。为了简单演示,我们在MainWindow类中添加School和Studen类对象作为成员变量,在MainWindow的构造函数中创建对象,并构建“学校->通知->学生->上课”的信号槽连接,同时emit发射该信号,来观察实验现象。

①School.h:

#ifndef SCHOOL_H
#define SCHOOL_H#include <QObject>class School : public QObject
{Q_OBJECT
public:explicit School(QObject *parent = nullptr);signals://自定义信号void sendMessage();//学校通知};#endif // SCHOOL_H

②Student.h:

#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = nullptr);signals:public slots://自定义槽void goToClass();};#endif // STUDENT_H

③Student.cpp:

#include "student.h"
#include <QDebug>Student::Student(QObject *parent) : QObject(parent)
{}void Student::goToClass()
{qDebug() << "学生上课!" << endl;
}

④MainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "school.h"
#include "student.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;School *school;Student *student;
};
#endif // MAINWINDOW_H

⑤MainWindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);school = new School(this);student = new Student(this);connect(school, SIGNAL(sendMessage()), student, SLOT(goToClass()));//信号与槽的连接emit school->sendMessage();//发射信号
}MainWindow::~MainWindow()
{delete ui;delete school;delete student;
}


二、QT的对象树

1. 为什么需要设置父对象?

答:因为需要将某些控件附着于父对象,以便能跟着父对象一起移动,方便控件的管理。

2. 如何设置父对象?

答:有构造函数传参和调用setparent()两种方式,如下所示:

//方式一:构造函数传入父对象地址
pushButton = new QPushButton(this);
//方式二:调用setParent函数
pushButton->setParent(this);

3. QT的对象树机制

答:父对象在调用析构函数前,会将附着于其上面所有的对象析构,再调用自己的析构函数。因此,可以不用显式地delete某些附着的对象,QT的对象树机制会自动将其销毁。


三、添加资源文件

有时需要外部的图片等资源,因此需要将资源文件添加进QT。

步骤一:将资源文件放置于当前工程目录下。

步骤二:添加"QT Resource File":

步骤三:添加资源路径的目录:

步骤四:添加外部图片:


四、样式表的使用

上一章已经加载了外部图片资源文件,本章改变样式表(stylesheet)将该图片呈现于窗口中。若不知道如何编写样式表的代码,可以去“帮助”中查找“stylesheet”查看“Qt Style Sheets Reference ”。

步骤一:在ui设计器中将QLable控件拖拽至窗口中:

步骤二:右击该控件,选中"改变样式表",添加图片:


五、QSS文件的使用

在上一章中,我们利用ui设计器来改变样式表从而加载外部图片。相应地,我们可以通过写代码的方式来改变样式表从而改变某些控件的外观。但是,当样式表书写过多时会影响我们代码的可读性。因此,可以通过qss文件来汇总这些样式表,而不需要在主程序中书写这些样式表。

原始效果:在Widget类的构造函数中写这些样式表。

我们将上述的样式表代码转移到qss文件中,减少主程序代码的复杂度。若不知道怎么写qss样式表,可以参考Qt QSS样式表总结

步骤一:新建qss文件:

步骤二:编辑qss文件:

步骤三:main()中加载qss文件:

运行结果:

/* 加载QSS文件 */
QFile file(":/style.qss");
if (file.exists()){file.open(QFile::ReadOnly);//只读方式打开QString styleSheet = QLatin1String(file.readAll());//字符串方式保存结果qApp->setStyleSheet(styleSheet);//设置全局样式file.close();//关闭文件
}

六、常用函数与宏

常用宏如下:

【1】Q_OBJECT:声明在private中,用到了信号槽就要添加。

【2】Q_UNUSED(变量名):告诉编译器不使用某个变量。

【3】Q_CLASSINFO(key, value):给出类的相关信息。例如:Q_CLASSINFO("Author", "swear")

//设置类的信息
Q_CLASSINFO("Author", "swear")
Q_CLASSINFO("version", "1.0")//循环读取类的信息,需要添加相关的头文件
const QMetaObject *meta = boy->metaObject();
for (int i = 0; i < meta->classInfoCount(); ++i){QMetaClassInfo classInfo =  meta->classInfo(i);qDebug() << classInfo.name() << classInfo.value();
}

【4】Q_PROPERTY(...):属性宏,用于给用户设置、获取属性。若设置属性不存在时,会设置动态属性。设置属性: "对象指针->setProperty(识别名, 值)"。获取属性: "对象指针->property(识别名).toXxx"。

//假设我们有个QPerson类,类内有属性m_name, m_age, m_score
//通过setProperty设置name时,就会去执行setName
Q_PROPERTY(QString name READ getName WRITE setName)//以下将"age"与属性m_age绑定,之后的读取都是针对m_age
Q_PROPERTY(unsigned int age MEMBER m_age)
Q_PROPERTY(unsigned int score MEMBER m_score)//创建对象,读写属性
QPerson p;
p.setProperty("name", "王甩笼");//就会去调用setName方法
p.setProperty("age", 10);//将p内部属性m_age设置为10
qDebug() << p.property("name").toString();//打印"王甩笼"

常用函数如下:

【1】QWidget类中的update():更新界面。

【2】QWidget类中的show():显示界面。若某个界面类在实例化时没有指定父对象,则需要调用该函数来显示界面。

【3】sender():在槽函数中获取发出信号的对象,用指针变量接收。例如QTcpSocket *tmpTcpSocket = (QTcpSocket*)sender();

相关文章:

【QT5】<总览二> QT信号槽、对象树及常用函数

文章目录 前言 一、QT信号与槽 1. 信号槽连接模型 2. 信号槽介绍 3. 自定义信号槽 二、QT的对象树 三、添加资源文件 四、样式表的使用 五、QSS文件的使用 六、常用函数与宏 前言 承接【QT5】&#xff1c;总览一&#xff1e; QT环境搭建、快捷键及编程规范。若存在版…...

Button按钮类

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 按钮是GUI界面中应用最为广泛的控件&#xff0c;它常用于捕获用户生成的单击事件&#xff0c;其最明显的用途是触发绑定到一个处理函数。 wxPython类…...

代码随想录-二叉树 | 111 二叉树的最小深度

代码随想录-二叉树 | 111 二叉树的最小深度 LeetCode 111 二叉树的最小深度解题思路代码难点总结 LeetCode 111 二叉树的最小深度 题目链接 代码随想录 题目描述 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…...

PCA降维算法

decomposition.h #pragma once #include <arrayfire.h>namespace decomposition {class PCA{public:af::array zero_centred(af::array...

Fast R-CNN 与 R-CNN的不同之处

目录 一、Fast R-CNN如何生成候选框特征矩阵 二、 关于正负样本的解释 三、训练样本的候选框 四、Fast R-CNN网络架构 4.1 分类器 4.2 边界框回归器 一、Fast R-CNN如何生成候选框特征矩阵 在R-CNN中&#xff0c;通过SS算法得到2000个候选框&#xff0c;则需要进行2000…...

前端开发环境:Vue、Element Plus、Axios

目录 1. Vue简介 2. Element Plus简介 3. Axios简介 4. 创建Vue项目 4.1 Node.js安装 4.2 创建Vue项目 4.3 Vue项目的结构 4.4 安装Element-Plus 4.5 安装Axios 4.6 解决跨域问题 5. 应用实例 5.1 创建Vue组件 5.2 配置路由 5.3 配置根组件 5.4 启动前端应用服…...

我的创作纪念日-在SCDN的5年

机缘 五年前&#xff0c;一个偶然的机会让我接触到了SCDN这个充满活力和创造力的社区。我抱着对技术的热爱和对知识的渴望&#xff0c;决定在这里开启我的创作之旅。最初&#xff0c;我成为创作者的初心&#xff0c;是希望将自己在实战项目中的经验、日常学习过程中的点滴&…...

AI-知识库搭建(二)GPT-Embedding模型使用

上一篇&#xff1a;AI-知识库搭建&#xff08;一&#xff09;腾讯云向量数据库使用-CSDN博客 一、Embedding模型 Embedding模型是一种将高维度的离散数据&#xff08;如文本、图像、音频等&#xff09;映射到低维度的连续向量空间的技术。这种技术广泛应用于自然语言处理&…...

qt网络事件之QSocketNotifier

简介 QSocketNotifier用于处理网络事件的,即事件处理器 结构 #mermaid-svg-xcNdAyHNkKqNCLQY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xcNdAyHNkKqNCLQY .error-icon{fill:#552222;}#mermaid-svg-xcNdAyHNk…...

如何统计EXCEL中的数据透视表的信息?

也没什么可分析的&#xff0c;直接上代码&#xff0c;看看是不是你需要的&#xff1a; Sub GetPVT() 定义一个1000行的数组&#xff0c;如果你预判工作簿中数据透视表数量可能大小1000&#xff0c;那就改成10000&#xff0c;甚至10万&#xff0c;以确保能大于数据透视表数量即…...

日本结构型产品及衍生品业务变迁报告

日本结构型产品及衍生品业务变迁报告 一、业务发展阶段 阶段一&#xff1a;2000年之前 零售结构型产品几乎不存在&#xff0c;主要销售对象为机构投资者或企业。主要策略为卖出看涨期权&#xff08;covered call&#xff09;。会计记录准则对业务有重要影响&#xff0c;例如…...

解决Mac无法上网/网络异常的方法,重置网络

解放方法 1、前往文件夹&#xff1a;/Library/Preferences/SystemConfiguration 2 、在弹窗中输入上边的地址 3 、把文件夹中除了下图未选中的文件全部删掉&#xff0c;删除时需要输入密码 4 、重启mac 电脑就搞定了。...

[12] 使用 CUDA 进行图像处理

使用 CUDA 进行图像处理 当下生活在高清摄像头的时代&#xff0c;这种摄像头能捕获高达1920*1920像素的高解析度画幅。想要实施的处理这么多的数据&#xff0c;往往需要几个TFlops地浮点处理性能&#xff0c;这些要求CPU也无法满足通过在代码中使用CUDA&#xff0c;可以利用GP…...

MyBatisPlus代码生成器(交互式)快速指南

引言 本片文章是对代码生成器(交互)快速配置使用流程&#xff0c;更多配置方法可查看官方文档&#xff1a; 代码生成器配置官网 如有疑问欢迎评论区交流&#xff01; 文章目录 引言演示效果图引入相关依赖创建代码生成器对象引入Freemarker模板引擎依赖支持的模板引擎 MyBat…...

深度学习模型训练之日志记录

在深度学习模型训练过程中&#xff0c;进行有效的训练日志记录是至关重要的。以下是一些常见的策略和工具来实现这一目标&#xff1a; 1. 使用TensorBoard TensorBoard是TensorFlow提供的一个可视化工具&#xff0c;用于记录和展示训练过程中的各种指标。 设置TensorBoard&a…...

深入理解Python中的装饰器

装饰器是Python中一个强大且灵活的工具,允许开发者在不修改函数或类定义的情况下扩展或修改其行为。装饰器广泛应用于日志记录、访问控制、缓存等场景。本文将详细探讨Python中的装饰器,包括基本概念、函数装饰器和类装饰器、内置装饰器以及装饰器的高级用法。 目录 装饰器概…...

基于springboot的人力资源管理系统源码数据库

传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;员工信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大用户的…...

如何舒适的使用VScode

安装好VScode后通常会很不好用&#xff0c;以下配置可以让你的VScode变得好用许多。 VScode的配置流程 1、设置VScode中文2、下载C/C拓展&#xff0c;使代码可以跳转3、更改编码格式4、设置滚轮缩放5、设置字体6、设置保存自动改变格式7、vscode设置快捷代码 1、设置VScode中文…...

【微信小程序】开发环境配置

目录 小程序的标准开发模式&#xff1a; 注册小程序的开发账号 安装开发者工具 下载 设置外观和代理 第一个小程序 -- 创建小程序项目 查看项目效果 第一种&#xff1a;在模拟器上查看项目效果 项目的基本组成结构 小程序代码的构成 app.json文件 project.config…...

启动盘镜像制作神器(下载即用)

一、简介 1、一款受欢迎且功能强大的USB启动盘制作工具,允许用户将操作系统镜像文件(如Windows或Linux的ISO文件)制作成可引导的USB启动盘。它支持多种操作系统,包括Windows、Linux和各种基于UEFI的系统。Rufus的一个显著特点是制作速度快,据称其速度比其他常用工具如UNet…...

PHP框架详解 - Symfony框架

引言 在现代Web开发中&#xff0c;PHP作为一种灵活且功能强大的编程语言&#xff0c;广泛应用于各种Web应用程序的开发中。为了提高开发效率、代码的可维护性和可扩展性&#xff0c;开发者通常会选择使用框架来构建应用程序。在众多PHP框架中&#xff0c;Symfony以其强大的功能…...

鸿蒙开发:【线程模型】

线程模型 线程类型 Stage模型下的线程主要有如下三类&#xff1a; 主线程 执行UI绘制。管理主线程的ArkTS引擎实例&#xff0c;使多个UIAbility组件能够运行在其之上。管理其他线程的ArkTS引擎实例&#xff0c;例如使用TaskPool&#xff08;任务池&#xff09;创建任务或取消…...

初级网络工程师之从入门到入狱(三)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 中小型网络系统综合实战实验 前言一、详细拓扑图二、LSW2交换机三、LSW3交换机四、LSW1三层交换机4.1、4.2、4.3、4.4、4.5、…...

【数据结构】排序(直接插入、折半插入、希尔排序、快排、冒泡、选择、堆排序、归并排序、基数排序)

目录 排序一、插入排序1.直接插入排序2.折半插入排序3.希尔排序 二、交换排序1.快速排序2.冒泡排序 三、选择排序1. 简单选择排序2. 堆排序3. 树排序 四、归并排序(2-路归并排序)五、基数排序1. 桶排序&#xff08;适合元素关键字值集合并不大&#xff09;2. 基数排序基数排序的…...

MongoDB ObjectId 详解

MongoDB ObjectId 详解 MongoDB 是一个流行的 NoSQL 数据库,它使用 ObjectId 作为文档的唯一标识符。ObjectId 是一个 12 字节的 BSON 类型,它在 MongoDB 中用于保证每个文档的唯一性。本文将详细解释 ObjectId 的结构、生成方式以及它在 MongoDB 中的应用。 ObjectId 的结…...

大数据-11-案例演习-淘宝双11数据分析与预测 (期末问题)

目录 第一部分 Hadoop是什么 官方解释&#xff1a; 个人总结 HDFS 是什么? 官方解释&#xff1a; 个人总结 yarn是什么? 官方解释&#xff1a; 个人总结 mapreduce&#xff0c;spark 是什么? 官方解释&#xff1a; MapReduce Spark 个人总结 MapReduce Spa…...

Kubernetes集群监控,kube-prometheus安装教程,一键部署

Kube-prometheus介绍 Kube-prometheus 是一个用于监控 Kubernetes 集群的完整解决方案。它基于 Prometheus 生态系统&#xff0c;提供了一整套预配置的组件和配置文件&#xff0c;以便轻松地在 Kubernetes 上部署和运行 Prometheus 监控系统。 Kube-prometheus 主要包括以下组…...

【Gradio】快速入门

https://www.gradio.app/ Gradio 是一个开源 Python 软件包https://github.com/gradio-app/gradio &#xff0c;可以让你快速为机器学习模型、API 或任何任意 Python 函数创建一个演示或网络应用程序。然后&#xff0c;您就可以使用 Gradio 内置的分享功能&#xff0c;在几秒钟…...

深度学习Day-19:DenseNet算法实战与解析

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a; 根据 Pytorch 代码&#xff0c;编写出 TensorFlow 代码研究 DenseNet 与 ResNetV 的区别改进思路是…...

基于openssl实现AES ECB加解密

AES加密&#xff0c;全称高级加密标准&#xff08;Advanced Encryption Standard&#xff09;&#xff0c;是一种广泛使用的对称加密算法&#xff0c;用于保护电子数据的安全。以下是AES加密的基本原理和特点&#xff1a; 基本概念 对称加密&#xff1a;AES是一种对称加密算法…...

成都网站建设 四川冠辰/google学术搜索

使用 resx 文件&#xff0c;可以动态切换语言&#xff0c; 新建Lang.zh-CN.resx Lang.en-US.resx 资源文件 新建空类Lang.cs 新建如下类&#xff1a; public class LanguageManager : INotifyPropertyChanged{private readonly ResourceManager _resourceManager;private s…...

门户网站建设哪里有/seo优化排名教程

decimal 数据类型最多可存储 38 个数字&#xff0c;所有数字都能够放到小数点的右边。decimal 数据类型存储了一个准确&#xff08;精确&#xff09;的数字表达法&#xff1b;不存储值的近似值。 定义 decimal 的列、变量和参数的两种特性如下&#xff1a; p 小数点左边和右边…...

自己的网站怎么和百度做友链/阳西网站seo

laravel 数据迁移实现订单列表 1,需要创建一个订单表表结构2,由于一个订单可能会包含多个商品,使用,需要一个从表3,创建订单控制器laravel 运行指定单个迁移文件1,需要创建一个订单表 在创建模型的时候再创建数据库迁移文件 php artisan make:model Order -m 完善数据…...

网页设计在邯郸能干什么/手机网站搜索优化

FlexibleLayout 项目地址&#xff1a;Gavin-ZYX/FlexibleLayout 更多&#xff1a;作者 提 Bug 标签&#xff1a; 可以下拉放大的 Layout...

flash视频网站源码下载/如何用模板做网站

QT5中&#xff0c;TABLEVIEW只显示表头&#xff0c;不显示数据。网上很多没找到原因。 经过我的测试&#xff0c;发现原因是&#xff1a;在一个程序里面&#xff0c;多次连接数据库&#xff0c;导致的。每个程序&#xff0c;只调用一次连接数据库&#xff0c;则没有这种效果...

做亚马逊产品测评的网站/制定营销推广方案

浮动引起的问题&#xff1a; 1.父元素高度坍塌。 2.后面非浮动元素跟随其后。破坏了页面布局。 html: <div class"test">前面的元素</div> <div class"parent"><div class"child1">左浮动</div><div class&quo…...