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

【QT5】<总览二> QT信号槽、对象树及样式表

文章目录

前言

一、QT信号与槽

1. 信号槽连接模型

2. 信号槽介绍

3. 自定义信号槽

二、不使用UI文件编程

三、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;
}


二、不使用UI文件编程

本章以按钮控件为例,说明仅编写代码来创建按钮。

步骤一:创建工程时取消勾选"Generate form":

步骤二:在mainwindow.h中声明按钮成员对象和头文件<QPushButton>:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPushButton>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();QPushButton *pushButton;//按钮对象
};
#endif // MAINWINDOW_H

步骤三:在mainwindow.cpp中的构造函数里创建按钮对象,并设置相关属性:

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{pushButton = new QPushButton(this);         //实例化按钮pushButton->setText("我是按钮");             //设置按钮文本pushButton->setGeometry(50, 100, 100, 50);  //设置按钮位置this->resize(800, 480);                     //设置当前窗口大小
}MainWindow::~MainWindow()
{delete pushButton;
}

三、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();//关闭文件
}

相关文章:

【QT5】<总览二> QT信号槽、对象树及样式表

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

2024.05.24 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、实习丨蔚来2025届实习生招募计划开启&#xff08;内推&#xff09; 实习丨蔚来2025届实习生招募计划开启&#xff08;内推&#xff09; 2、校招&实习丨联芯集成电路2025届暑期实习…...

如何理解 Java 8 引入的 Lambda 表达式及其使用场景

Lambda表达式是Java 8引入的一项重要特性&#xff0c;它使得编写简洁、可读和高效的代码成为可能。Lambda表达式本质上是一种匿名函数&#xff0c;能够更简洁地表示可传递的代码块&#xff0c;用于简化函数式编程的实现。 一、Lambda表达式概述 1. 什么是Lambda表达式 Lambd…...

GPT-4与GPT-4O的区别详解:面向小白用户

1. 模型介绍 在人工智能的语言模型领域&#xff0c;OpenAI的GPT-4和GPT-4O是最新的成员。这两个模型虽然来源于相同的基础技术&#xff0c;但在功能和应用上有着明显的区别。 GPT-4&#xff1a;这是一个通用型语言模型&#xff0c;可以理解和生成自然语言。无论是写作、对话还…...

使用throttle防止按钮多次点击

背景&#xff1a;如上图所示&#xff0c;点击按钮&#xff0c;防止按钮点击多次 <div class"footer"><el-button type"primary" click"submitThrottle">发起咨询 </el-button> </div>import { throttle } from loda…...

Echarts 在折线图的指定位置绘制一个图标展示

文章目录 需求分析需求 在线段交汇处用一个六边形图标展示 分析 可以使用 markPoint 和 symbol 属性来实现。这是一个更简单和更标准的方法来添加标记点在运行下述代码后,你将在浏览器中看到一个折线图,其中在 [3, 35] (即图表中第四个数据点 Thu 的 y 值为 35 的位置)处…...

适用于 Windows 的 8 大数据恢复软件

数据恢复软件可帮助您恢复因意外删除或由于某些技术故障&#xff08;如硬盘损坏等&#xff09;而丢失的数据。这些工具可帮助您从硬盘驱动器 (HDD) 中高效地恢复丢失的数据&#xff0c;因为这些工具不支持从 SSD 恢复数据。重要的是要了解&#xff0c;您删除的数据不会被系统永…...

HTTP基础

一、HTTP协议 1、HTTP协议概念 HTTP的全称是&#xff1a;Hyper Text Transfer Protocol&#xff0c;意为 超文本传输协议。它指的是服务器和客户端之间交互必须遵循的一问一答的规则。形容这个规则&#xff1a;问答机制、握手机制。 它规范了请求和响应内容的类型和格式, 是基于…...

深入了解Linux命令:visudo

深入了解Linux命令&#xff1a;visudo 在Linux系统中&#xff0c;sudo&#xff08;superuser do&#xff09;是一个允许用户以其他用户身份&#xff08;通常是超级用户或其他用户&#xff09;执行命令的程序。sudo的配置文件/etc/sudoers存储了哪些用户可以执行哪些命令的权限…...

十大排序 —— 希尔排序

十大排序 —— 希尔排序 什么是希尔排序插入排序希尔排序递归版本 我们今天来看另一个很有名的排序——希尔排序 什么是希尔排序 希尔排序&#xff08;Shell Sort&#xff09;是插入排序的一种更高效的改进版本&#xff0c;由Donald Shell于1959年提出。它通过比较相距一定间…...

SpringCloud Hystrix服务熔断实例总结

SpringCloud Hystrix断路器-服务熔断与降级和HystrixDashboard SpringCloud Hystrix服务降级实例总结 本文采用版本为Hoxton.SR1系列&#xff0c;SpringBoot为2.2.2.RELEASE <dependency><groupId>org.springframework.cloud</groupId><artifactId>s…...

为什么没有输出九九乘法表?

下面的程序本来想输出九九乘法表到屏幕上&#xff0c;为什么没有输出呢&#xff1f;怎样修改&#xff1f; <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>我的HTML练习</title> …...

EasyRecovery5步轻松恢复电脑手机数据,EasyRecovery带你探索!

在当今的数字化时代&#xff0c;数据已经成为我们生活和工作中不可或缺的一部分。无论是个人照片、工作文件还是重要的商业信息&#xff0c;数据的安全存储和恢复都显得尤为重要。EasyRecovery作为一款广受欢迎的数据恢复软件&#xff0c;为用户提供了强大的数据恢复功能&#…...

904. 水果成篮

904. 水果成篮 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;_904水果成篮_滑动窗口 错误经验吸取 原题链接&#xff1a; 904. 水果成篮 https://leetcode.cn/problems/fruit-into-baskets/description/ 完成情况&#xff1a; 解题思…...

在618集中上新,蕉下、VVC们为何押注拼多多?

编辑&#xff5c;Ray 自前两年崛起的防晒产品&#xff0c;今年依旧热度不减。 头部品牌蕉下&#xff0c;2020年入驻拼多多&#xff0c;如今年销售额已过亿元。而自去年起重点押注拼多多的时尚防晒品牌VVC&#xff0c;很快销量翻番。这两家公司&#xff0c;不约而同在618之前上…...

Maximo Attachments配置

以下内容以 Windows 上 Maximo 为例&#xff0c;并假定设置 DOCLINKS 的根路径为 “C:\DOCLINKS”。 HTTP Server配置 修改C:\Program Files\IBM\HTTPServer\conf\httpd.conf文件 查找 “DocumentRoot” 并修改成如下配置 DocumentRoot "C:\DOCLINKS"查找 “<…...

一分钟了解香港的场外期权报价

香港的场外期权报价 在香港这个国际金融中心&#xff0c;场外期权交易是金融市场不可或缺的一部分。场外期权&#xff0c;作为一种非标准化的金融衍生品&#xff0c;为投资者提供了在特定时间以约定价格买入或卖出某种资产的机会。对于希望参与这一市场的投资者来说&#xff0…...

专业开放式耳机什么牌子更好?六大技巧教你不踩坑!

相信很多入坑的朋友再最开始挑选耳机的时候都会矛盾&#xff0c;现在市面上这么多耳机&#xff0c;我该怎么选择&#xff1f;其实对于开放式耳机&#xff0c;大家都没有一个明确的概念&#xff0c;可能会为了音质的一小点提升而耗费大量的资金&#xff0c;毕竟这是一个无底洞。…...

注意!!24软考系统集成有变化,第三版考试一定要看这个!

系统集成在今年年初改版之后&#xff0c;上半年的考试也取消了&#xff0c;留给大家充足的时间来学习新的教材和考纲。但11月也将是第三版考纲的第1次考试&#xff0c;重点到底有什么&#xff1f;今天带大家详细的了解一下最新版中项考试大纲。 一、考试说明 1.考试目标 通过…...

Redis数据结构HyperLogLog以及布隆过滤器

HyperLogLog 引言 在开始之前&#xff0c;先思考一个常见的业务问题&#xff1a;如果负责开发维护一个大型的网站&#xff0c;有一天老板找产品经理要网站每个网页每天的UV数据&#xff0c;然后来开发这个统计模块&#xff0c;需要如何实现&#xff1f; 如果统计PV非常好办&…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...