QT学习日记一
- 创建QT文件步骤
这是创建之后widget.cpp和widget.h文件的具体代码解释,也是主要操作的文件,其中main.cpp不用操作,ui则是图形化操作界面,综合使用时,添加一个元件要注意重编名和编译一下,才能在widget这类文件中提示出来
//widget.h
#ifndef WIDGET_H // 如果没有定义WIDGET_H宏,则定义它。这个宏防止头文件被多次包含。
#define WIDGET_H // 定义WIDGET_H宏。#include <QWidget> // 包含Qt库中的QWidget类的头文件。QWidget是所有UI对象的基类。QT_BEGIN_NAMESPACE // 开始Qt命名空间的定义。
namespace Ui { class Widget; } // 前向声明Ui命名空间中的Widget类。这个类是由Qt Designer生成的,用于管理UI。
QT_END_NAMESPACE // 结束Qt命名空间的定义。class Widget : public QWidget // 定义Widget类,继承自QWidget类。
{Q_OBJECT // 这是一个Qt宏,启用Qt的信号和槽机制。public:Widget(QWidget *parent = nullptr); // 构造函数,接受一个父窗口指针,默认值为nullptr(空指针)。~Widget(); // 析构函数,销毁Widget对象。
//可以在这里声明信号槽函数,不过要添加关键字public slot:,类同publicprivate:Ui::Widget *ui; // 指向Ui::Widget对象的指针,用于管理用户界面。
};#endif // WIDGET_H // 结束WIDGET_H宏的条件编译。
//widget.cpp
#include "widget.h" // 包含当前类的头文件,这个文件中定义了Widget类的声明和成员函数原型。
#include "ui_widget.h" // 包含由Qt用户界面设计工具(Qt Designer)生成的头文件,这个文件中定义了Ui::Widget类,负责UI元素的布局和定义。Widget::Widget(QWidget *parent): QWidget(parent) // 调用父类QWidget的构造函数,并将父窗口指针parent传递给它。父窗口指针用于指定当前窗口的父窗口。, ui(new Ui::Widget) // 分配内存,创建一个新的Ui::Widget对象,并将其指针赋值给成员变量ui。Ui::Widget类由Qt Designer生成,用于管理窗口小部件的布局和控件。
{ui->setupUi(this); // 调用Ui::Widget类的setupUi方法,初始化用户界面。这会将设计器中定义的UI元素(如按钮、标签等)设置到当前Widget对象中。//ui上的操作元件大多也在这里使用,比如connect
}Widget::~Widget()
{delete ui; // 在析构函数中删除ui指针指向的Ui::Widget对象,释放其占用的内存,防止内存泄漏。
}
//在此处定义widget类中的函数
一、log输出
- 在Qt中进行log输出, 一般不使用c中的printf, 也不是使用C++中的cout, Qt框架提供了专门用于日志输出的类, 头文件名为 QDebug
- qDebug(), qWarning(), qInfo(), 和 qCritical()是用于日志记录和调试输出的函数。它们分别用于不同级别的日志记录,帮助开发者在不同场景下记录和调试信息。
- qDebug():用于开发阶段的调试信息,不重要的详细信息。
- qWarning():用于警告信息,表示有潜在问题,但不一定是致命的。
- qInfo():用于一般信息,常规运行时的状态信息。
- qCritical():用于严重错误信息,表示重大问题或异常。
- 默认情况下日志信息是不会打印到终端窗口的, 如果想要实现这样的效果, 必须在项目文件中添加相关的属性信息----->打开项目文件(*.pro)找到配置项 config, 添加 console 控制台属性----->
CONFIG += c++11 console
二、帮助
- 将光标放在函数上,按 F2+FN 会跳转到 函数的定义。
- 将光标放在函数上,按 Shift + F2+FN 会跳转到函数的声明(如果在头文件中声明)。
- 将光标放在函数上,按 Ctrl + Shift + U 会查找函数在项目中的所有使用情况。
- 将光标放在函数上,按 F1 +FN会打开Qt帮助窗口,显示 函数 的详细文档。
三、QT中的信号槽
- 在Qt中,信号和槽机制是一种用于对象之间通信的方式,特别适用于事件驱动的编程。信号和槽机制允许一个对象发送信号并且其他对象响应这些信号,即使它们对彼此一无所知。这种机制比传统的回调函数更灵活、更容易使用。
- 信号和槽机制的内部工作原理
- 元对象系统(MOC)
当您定义一个包含信号和槽的类时,Qt的元对象系统(MOC)会生成一些额外的代码。这些代码负责实现信号和槽的机制。MOC会为每个信号生成一个唯一的整数ID,并创建一个包含信号和槽信息的表。 - 连接信号和槽
当您调用connect函数时,Qt会将信号和槽的连接信息存储在QObject的内部数据结构中。每个QObject对象都有一个指向QMetaObject的指针,QMetaObject包含了该对象的所有元数据信息,包括信号和槽的连接信息。 - 发射信号
信号被发射时,Qt会查找与该信号连接的所有槽,并依次调用它们。对于同一线程中的连接,槽函数会立即被调用。对于跨线程的连接,信号会被放入接收者所在线程的事件队列中,等待事件循环调度执行。 - 事件队列
Qt使用事件队列和事件循环来管理跨线程的信号和槽连接。当跨线程信号被发射时,信号会被封装成一个事件,并放入接收者线程的事件队列中。接收者线程的事件循环会处理这些事件,并调用相应的槽函数。
- 连接信号和槽的函数connect()函数
函数原型(老旧的)QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));- sender:发出信号的对象的指针
- SIGNAL(signal()):发送者的信号。signal()是发送者类中的信号名称。()内的参数可以再一次细分信号类型。
- receiver:接收者对象指针。表示在当前的类里面
- SLOT(slot()):接收者的槽函数,使用SLOT宏来指定接收者类中的槽函数。slot()是接收者类中的槽函数名称。()内的参数可以再一次细分信号类型。
-------------------------------------------------------------------------------------------
connect函数相对于做了信号处理动作的注册
调用conenct函数的sender对象的信号并没有产生, 因此receiver对象的method也不会被调用
connect中的sender和recever两个指针必须被实例化了, 否则conenct不会成功
- 在Qt中,槽函数是用于响应信号的函数。槽函数可以是任何符合签名要求的成员函数、全局函数或静态函数。它们在某些事件(由信号发射)发生时被调用。例如btnLogClickedSlotFun()就是自定义的槽函数。
- 信号函数:clicked()、pressed()、released(),分别是点击,按下持续,释放
- 自定义信号和自定义槽函数
自定义信号的要求和注意事项:信号是类的成员函数
返回值必须是 void 类型
信号的名字可以根据实际情况进行指定
参数可以随意指定, 信号也支持重载
信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
信号函数只需要声明, 不需要定义(没有函数体实现)
在程序中发射自定义信号: 发送信号的本质就是调用信号函数
习惯性在信号函数前加关键字: emit, 但是可以省略不写
emit只是显示的声明一下信号要被发射了, 没有特殊含义
底层 emit == #define emit自定义槽函数的要求
槽函数必须是类的成员函数:
槽函数必须是继承自 QObject 的类的成员函数,不能是全局函数。槽函数必须标记为 slots 或使用 Q_SLOT 关键字:
在类定义中,槽函数需要使用 slots 或 Q_SLOT 关键字标记。例如:public slots:void mySlotFunction();槽函数的参数类型和数量必须与信号匹配:
槽函数的参数类型和数量必须与连接的信号一致。例如,如果信号的签名是 void signal(int, QString),那么槽函数的签名也应该是 void slot(int, QString)。槽函数的访问权限可以是 public、protected 或 private:
槽函数可以是 public、protected 或 private,这取决于类的设计和访问控制需求。
确保信号和槽的参数类型和顺序一致。如果不匹配,编译器不会报错,但运行时连接将失败,信号和槽之间不会通信。
槽函数的执行时间应尽量短,不要在槽函数中执行长时间阻塞的操作,因为这可能会阻塞事件循环,导致用户界面无响应。
如果不再需要信号和槽之间的连接,可以使用 disconnect 函数断开它们。可以断开特定的信号和槽,也可以断开对象之间所有的信号和槽。小窍门(在连接处加上dis即可)
5. 一个信号可以连接多个槽函数, 发送一个信号有多个处理动作,槽函数的执行顺序是随机的, 和connect函数的调用顺序没有关系,一个槽函数可以连接多个信号, 多个不同的信号, 处理动作是相同的
相关文章:
QT学习日记一
创建QT文件步骤 这是创建之后widget.cpp和widget.h文件的具体代码解释,也是主要操作的文件,其中main.cpp不用操作,ui则是图形化操作界面,综合使用时,添加一个元件要注意重编名和编译一下,才能在widget这类…...
redhat7.x 升级openssh至openssh-9.8p1
1.环境准备: OS系统:redhat 7.4 2.备份配置文件: cp -rf /etc/ssh /etc/ssh.bak cp -rf /usr/bin/openssl /usr/bin/openssl.bak cp -rf /etc/pam.d /etc/pam.d.bak cp -rf /usr/lib/systemd/system /usr/lib/systemd/system.bak 3.安装…...
Spring Cloud Eureka
引入:远程调用时,url是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 解决思路: 比如(医院,学校等)机构的电话号码发生变化,就需要通知各个使⽤…...
threejs
1.场景清空,释放内容 // 假设你已经有一个Three.js的场景对象scene// 函数:清空场景中的所有对象 function clearScene(scene) {while(scene.children.length > 0){const object scene.children[0];if(object.isMesh) {// 如果有几何体和材质&#…...
将pytorch 模型封装为c++ api 例子
在 PyTorch 中,通常使用 Python 来定义和训练模型,但是可以将训练好的模型导出为 TorchScript,然后在 C 中加载和使用。以下是一个详细的过程,展示了如何将 PyTorch 模型封装成 C API: 步骤 1: 定义和训练模型&#x…...
珠宝迷你秤方案
珠宝迷你秤作为一种便携式电子称重设备,因其小巧、便携、精度高等特点,广泛应用于各种需要精确称重的场景。可能这个目前在国内使用的人比较少,但在西方国家珠宝迷你秤却是可以用来送礼的物品。因为珠宝迷你秤的外观跟手机外观大多相似&#…...
边缘概率密度、条件概率密度、边缘分布函数、联合分布函数关系
目录 二维随机变量及其分布离散型随机变量连续型随机变量边缘分布边缘概率密度举例边缘概率密度 条件概率密度边缘概率密度与条件概率密度的区别边缘概率密度条件概率密度举个具体例子 参考资料 二维随机变量及其分布 离散型随机变量 把所有的概率,都理解成不同质量…...
软件架构之系统分析与设计方法(2)
软件架构之系统分析与设计方法(2) 8.4 面向对象的分析与设计8.4.1 面向对象的基本概念8.4.2 面向对象分析8.4.3 统一建模语言 8.5 用户界面设计8.5.1 用户界面设计的原则8.5.2 用户界面设计过程 8.6 工作流设计8.6.1 工作流设计概述8.6.2 工作流管理系统 8.7 简单分…...
AD确定板子形状
方法1 修改栅格步进值,手动绘制 https://cnblogs.com/fqhy/p/13768031.html 方法2 器件摆放确定板子形状 https://blog.csdn.net/Mark_md/article/details/116445961...
CSS【详解】边框 border,边框-圆角 border-radius,边框-填充 border-image,轮廓 outline
边框 border border 是以下三种边框样式的简写: border-width 边框宽度 —— 数值 px(像素),thin(细),medium(中等),thick(粗)border-style 边框线型 —— none【默认值…...
Error: EBUSY: resource busy or locked, rmdir...npm install执行报错
Error: EBUSY: resource busy or locked, rmdir...npm install执行报错 你一个文件夹目录开了两个cmd命令行(或者powershell),关掉一个就好了。...
Hot100-排序
1.快排 215. 数组中的第K个最大元素 - 力扣(LeetCode) (1)第k大的元素在排序数组中的位置是nums.length - k。 假设我们有一个数组nums [3, 2, 1, 5, 6, 4],并且我们想找到第2大的元素。 步骤 1:排序数…...
树链剖分相关
树链剖分这玩意儿还挺重要的,是解决静态树问题的一个很好的工具~ 这里主要介绍一下做题时经常遇到的两个操作: 1.在线求LCA int LCA(int x,int y){while(top[x]!top[y])if(dep[top[x]]>dep[top[y]]) xfa[top[x]];else yfa[top[y]];return dep[x]&l…...
如何将Grammarly内嵌到word中(超简单!)
1、下载 安装包下载链接见文章结尾 官网的grammarly好像只能作为单独软件使用,无法内嵌到word中🧐🧐🧐 2、双击安装包(安装之前把Office文件都关掉) 3、安装完成,在桌面新建个word文件并打开 注…...
OTG -- 用于FPGA的ULPI接口芯片USB3320讲解(续)
目录 1 背景 2 USB3320在FPGA上的应用 1 背景 最近使用FPGA驱动USB PHY实现高速USB功能,为了方便,购买了一块微雪的USB3300子板,发现怎么都枚举不了,使用逻辑分析仪抓取波形,和STM32F407USB3300波形进行对比…...
了解劳动准备差距:人力资源专业人员的战略
劳动准备差距是一个紧迫的问题,在全球人事部门回应,谈论未开发的潜力和错过的机会。想象一下,人才和需求之间的悬崖之间有一座桥,这促使雇主思考:我们是否为员工提供了足够的设备来应对未来的考验? 这种不…...
SAP PS学习笔记02 - 网络,活动,PS文本,PS文书(凭证),里程碑
上一章讲了PS 的概要,以及创建Project,创建WBS。 SAP PS学习笔记01 - PS概述,创建Project和WBS-CSDN博客 本章继续讲PS的后续内容。包括下面的概念和基本操作,以及一些Customize: - 网络(Network…...
Github 2024-07-07php开源项目日报 Top9
根据Github Trendings的统计,今日(2024-07-07统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9Blade项目2JavaScript项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数…...
算法训练(leetcode)第二十六天 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、763. 划分字母区间
刷题记录 452. 用最少数量的箭引爆气球思路一思路二 435. 无重叠区间763. 划分字母区间 452. 用最少数量的箭引爆气球 leetcode题目地址 思路一 先按起始坐标从小到大排序。排序后找交集并将交集存入一个数组中,遍历气球数组从交集数组中找交集,找到与…...
Ubuntu 下 Docker安装 2024
Ubuntu 下 Docker安装 2024 安装1.卸载老版本2.更新apt包索引3.安装必要工具包4.添加Docker GPG秘钥5.配置仓库源6.安装Docker Engine7.启动docker 国内镜像源下架的解决办法1.修改文件 /etc/docker/daemon.json2.换源3.查看是否换源成功4.重启 安装 1.卸载老版本 sudo apt-ge…...
发送者的可靠性
这篇文章是了解MQ消息的可靠性,即:消息应该至少被消费者处理1次 那么问题来了: 我们该如何确保MQ消息的可靠性?如果真的发送失败,有没有其它的兜底方案? 首先,我们一起分析一下消息丢失的可能…...
Profibus_DP转ModbusTCP网关模块连马保与上位机通讯
Profibus转ModbusTCP网关模块(XD-ETHPB20)广泛应用于工业自动化领域。例如,可以将Profibus网络中的传感器数据转换为ModbusTCP协议,实现数据的实时监控和远程控制。本文介绍了如何利用Profibus转ModbusTCP网关(XD-ETHP…...
移动应用:商城购物类,是最常见的,想出彩或许就差灵犀一指
在移动应用中,商城购物类的非常常见,模式也非常成熟,想要设计的出彩也是有难度的,这次分享一些不同的。...
linux 查看历史命令列表来访问之前的内容的命令是:history
在Linux中,要查看历史命令列表以访问之前的内容,你可以使用history命令。这个命令会显示你当前shell会话(或者,如果你指定了参数,可能是所有会话)中执行过的命令列表。 基本用法 简单地输入history并按下…...
NAS免费用,鲁大师 AiNAS正式发布,「专业版」年卡仅需264元
7月10日,鲁大师召开新品发布会,正式发布旗下以“提供本地Ai部署和使用能力以及在线NAS功能”并行的复合软件产品:鲁大师 AiNAS。 全新的鲁大师 AiNAS将持续满足现如今大众对于数字化生活的全新需求,将“云存储”的便捷与NAS的大容…...
spring监听事件
1、spring-监听事件基本原理 Spring的事件监听机制和发布订阅机制是很相似的:发布了一个事件后,监听该类型事件的所有监听器会触发相应的处理逻辑 2、Spring 监听事件相关规范 在Spring中,事件监听机制主要涉及到了一下几个关键的规范&#x…...
微软发布E2 TTS: 一种简单但效果优秀的文本转语音技术
本文介绍了一种名为“Embarrassingly Easy Text-to-Speech(E2 TTS)”的文本转语音系统。 该系统通过将输入文本转换为填充标记字符序列,并基于音频填充值任务训练流匹配基mel频谱生成器,实现了人类水平的自然度和最先进的说话人相…...
python爬虫加入进度条
安装tqdm和requests库 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple带进度条下载 import time # 引入time模块,用于处理时间相关的功能 from tqdm import * # 从tqdm包中…...
力扣844.比较含退格的字符串
力扣844.比较含退格的字符串 栈模拟 class Solution {public:bool backspaceCompare(string s, string t) {int n s.size(),m t.size();stack<char> s1,s2;for(int i0;i<n;i){s1.push(s[i]);if(s[i] #){if(s1.size() 1) s1.pop();else s1.pop(),s1.pop();}}for(i…...
用户特征和embedding层做Concatenation
要将用户特征与嵌入层进行连接,可以使用深度学习框架(如TensorFlow或PyTorch)中的基本操作。以下是使用PyTorch的示例代码,展示了如何将用户特征与嵌入层连接起来。 示例代码(使用PyTorch) 安装 PyTorch 如…...
学生做任务赚钱的网站/新闻最新消息10条
大家好,我是小毛羊的村长,在今后的时间里跟大家一起聊一聊信用卡的各种玩法,教你如何从一个屌丝,通过玩转信用卡实现向高富帅的转变。真的不是村长吹牛逼,信用卡有大用处!快速跳过原始积累,走向人生巅峰&am…...
建设公司网站/一个新品牌怎样营销推广
直接赋值:其实就是对象的引用(别名,其实就是一个人今天叫张三 明天叫张狗子的意思)。浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象…...
怎么做网站管理系统/百度竞价客服
...
九江做网站大概多少钱/宁波外贸网站推广优化
什么是自动化测试 自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 常见的自动化测试工具:QTP、selenium、Rational Ro…...
做查询快递单号的网站多少钱/html网页制作网站
因为项目美观的需要,不想用默认的Tab控件,巨难看,找来找去。发现没有合适的,找了个老外的代码,改了下,自己实现了下,有用的童鞋,可以拿出用用,如果源代码更新,…...
武汉网站推广¥做下拉去118cr/宣传软文是什么意思
“我可能干了个假的数据分析师!”经常有同学发出这种感慨,然后到处发《数据分析师是干什么的》《数据分析师、数据工程师、数据运营、数据挖掘工程师、商业数据分析师、我随便写个什么分析师之间到底有什么区别》一类的帖子。之所以会这样,是…...