Qt---感觉挺重要的部分
目录
一、讲述Qt信号槽机制与优势与不足
二、Qt信号和槽的本质是什么
三、描述QT中的文件流(QTextStream)和数据流(QDataStream)的区别
四、描述QT的TCP通讯流程
服务端:(QTcpServer)
客户端:(QTcpSocket)
五、 描述UDP 之 UdpSocket通讯
六、多线程使用使用方法
七、多线程下,信号槽分别在什么线程中执行,如何控制
一、讲述Qt信号槽机制与优势与不足
优点:
①类型安全。需要关联的信号槽的签名必须是等同的。即信号的参数类型和参数个数同接受该信号的槽的参数类型和参数个数相同。若信号和槽签名不一致,编译器会报错。
②松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是那个对象的那个信号槽接收它发出的信号,它只需在适当的时间发送适当的信号即可,而不需要关心是否被接受和那个对象接受了。Qt就保证了适当的槽得到了调用,即使关联的对象在运行时被删除。程序也不会奔溃。
③灵活性。一个信号可以关联多个槽,或多个信号关联同一个槽。
不足:速度较慢。与回调函数相比,信号和槽机制运行速度比直接调用非虚函数慢10倍。
原因:①需要定位接收信号的对象。②安全地遍历所有关联槽。③编组、解组传递参数。④多线程的时候,信号需要排队等待。(然而,与创建对象的new操作及删除对象的delete操作相比,信号和槽的运行代价只是他们很少的一部分。信号和槽机制导致的这点性能损耗,对实时应用程序是可以忽略的。)
二、Qt信号和槽的本质是什么
回调函数。信号或是传递值,或是传递动作变化;槽函数响应信号或是接收值,或者根据动作变化来做出对应操作。
三、描述QT中的文件流(QTextStream)和数据流(QDataStream)的区别
文件流(QTextStream)。操作轻量级数据(int,double,QString)数据写入文本件中以后以文本的方式呈现。
数据流(QDataStream)。通过数据流可以操作各种数据类型,包括对象,存储到文件中数据为二进制。
文件流,数据流都可以操作磁盘文件,也可以操作内存数据。通过流对象可以将对象打包到内存,进行数据的传输。
四、描述QT的TCP通讯流程
服务端:(QTcpServer)
①创建QTcpServer对象
②监听list需要的参数是地址和端口号
③当有新的客户端连接成功回发送newConnect信号
④在newConnection信号槽函数中,调用nextPendingConnection函数获取新连接QTcpSocket对象
⑤连接QTcpSocket对象的readRead信号
⑥在readRead信号的槽函数使用read接收数据
⑦调用write成员函数发送数据
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);tcpServer = new QTcpServer;tcpServer->listen(QHostAddress("192.168.0.xxxx"),8888);connect(tcpServer,SIGNAL(newConnection()),this,SLOT(new_connect()));
}Widget::~Widget()
{delete ui;
}void Widget::new_connect()
{qDebug("--new connect--");QTcpSocket* tcpSocket = tcpServer->nextPendingConnection();connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(read_data()));socketArr.push_back(tcpSocket);}void Widget::read_data()
{for(int i=0; i<socketArr.size(); i++){if(socketArr[i]->bytesAvailable()){char buf[256] = {};socketArr[i]->read(buf,sizeof(buf));qDebug("---read:%s---",buf);}}
}
客户端:(QTcpSocket)
①创建QTcpSocket对象
②当对象与Server连接成功时会发送connected 信号
③调用成员函数connectToHost连接服务器,需要的参数是地址和端口号
④connected信号的槽函数开启发送数据
⑤使用write发送数据,read接收数据
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);tcpSocket = new QTcpSocket;connect(tcpSocket,SIGNAL(connected()),this,SLOT(connect_success()));tcpSocket->connectToHost("172.20.10.xxxx",8888);
}Widget::~Widget()
{delete ui;
}void Widget::on_send_clicked()
{std::string msg = ui->msg->text().toStdString();int ret = tcpSocket->write(msg.c_str(),msg.size()+1);qDebug("--send:%d--",ret);
}void Widget::connect_success()
{ui->send->setEnabled(true);
}
五、 描述UDP 之 UdpSocket通讯
UDP(User Datagram Protocol即用户数据报协议)是一个轻量级的,不可靠的,面向数据报的无连接协议。在网络质量令人十分不满意的环境下,UDP协议数据包丢失严重。由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。所以QQ这种对保密要求并不太高的聊天程序就是使用的UDP协议。
在Qt中提供了QUdpSocket 类来进行UDP数据报(datagrams)的发送和接收。Socket简单地说,就是一个IP地址加一个port端口 。
流程:①创建QUdpSocket套接字对象 ②如果需要接收数据,必须绑定端口 ③发送数据用writeDatagram,接收数据用 readDatagram 。
六、多线程使用使用方法
方法一:①创建一个类从QThread类派生②在子线程类中重写 run 函数, 将处理操作写入该函数中 ③在主线程中创建子线程对象, 启动子线程, 调用start()函数
方法二:①将业务处理抽象成一个业务类, 在该类中创建一个业务处理函数②在主线程中创建一QThread类对象 ③在主线程中创建一个业务类对象 ④将业务类对象移动到子线程中 ⑤在主线程中启动子线程 ⑥通过信号槽的方式, 执行业务类中的业务处理函数
多线程使用注意事项: * 1. 业务对象, 构造的时候不能指定父对象 * 2. 子线程中不能处理ui窗口(ui相关的类) * 3. 子线程中只能处理一些数据相关的操作, 不能涉及窗口
七、多线程下,信号槽分别在什么线程中执行,如何控制
可以通过connect的第五个参数进行控制信号槽执行时所在的线程
connect有几种连接方式,直接连接和队列连接、自动连接
直接连接(Qt::DirectConnection):信号槽在信号发出者所在的线程中执行
队列连接 (Qt::QueuedConnection):信号在信号发出者所在的线程中执行,槽函数在信号接收者所在的线程中执行
自动连接 (Qt::AutoConnection):多线程时为队列连接函数,单线程时为直接连接函数。
相关文章:
Qt---感觉挺重要的部分
目录 一、讲述Qt信号槽机制与优势与不足 二、Qt信号和槽的本质是什么 三、描述QT中的文件流(QTextStream)和数据流(QDataStream)的区别 四、描述QT的TCP通讯流程 服务端:(QTcpServer) 客户端:(QTcpSocket…...
springboot+vue家乡特色推荐系统(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的家乡特色推荐系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…...
在Shell脚本中通过ssh从脚本运行函数
文章目录 在Shell脚本中通过ssh从脚本运行函数declare -f 和typset -f,这两个命令有什么区别declare -f 和typset -f,这两个命令可以通过ssh运行脚本中的函数吗如果我有main.sh和util.sh,并且在main.sh中引用了util.sh,该怎么办&a…...
简单学习一下 MyBatis 动态SQL使用及原理
MyBatis 是一个优秀的持久层框架,它提供了丰富的 SQL 映射功能,可以让我们通过 XML 或注解方式来定义 SQL 语句。它很大程度上简化了数据库操作,提高了开发效率。动态 SQL 是其中一个非常重要的功能,可以让我们根据不同的条件动态…...
WhatsApp如何让客户参与变得更简单?
WhatsApp对你的品牌来说可能和Twitter和Facebook一样重要,你可能已经把它们纳入你的社交媒体战略。 是的,WhatsApp不仅仅可以用来给同事发短信或与远方的亲戚视频聊天,它也适用于商业。 在发展WhatsApp业务时,小企业主得到了最优…...
记一次 MySQL 主从同步异常的排查记录,百转千回
本文主要内容如下: 一、现象 最近项目的测试环境遇到一个主备同步的问题: 备库的同步线程停止了,无法同步主库的数据更改。 备库报错如下: 完整的错误信息: Relay log read failure: Could not parse relay log even…...
Cpython的多线程技术之痛
历史原因 在Python官网下载的默认解释器是采用C语言编写的Cpython解释器。在Python语言开发之初,计算机都是单核CPU,每个单核CPU同一时刻只能运行一个线程。为了模拟多线程工作,这里采用了模拟机制,让不同线程根据时间片段&#…...
NDK OpenGL离屏渲染与工程代码整合
NDK系列之OpenGL离屏渲染与工程代码整合,本节主要是对上一节OpenGL渲染画面效果代码进行封装设计,将各种特效代码进行分离解耦,便于后期增加其他特效。 实现效果: 实现逻辑: 1.封装BaseFilter过滤器基类,…...
Python基础入门编程代码练习(二)
一、求1~100之间不能被3整除的数之和 循环条件:i<100循环操作 实现代码如下: def sums():sum 0for num in range(1, 101):if num % 3 ! 0:sum numprint("1~100之间不能被3整除的数之和为:%s" % (sum))sums() print("1~…...
C# | 对象池
对象池 文章目录 对象池前言什么是对象池对象池的优点对象池的缺点 实现思路示例代码 结束语 前言 当我们开发一个系统或者应用程序时,我们通常需要创建很多的对象,这些对象可能是线程、内存、数据库连接、文件句柄等等。在某些情况下,我们需…...
CSS小技巧之圆形虚线边框
虚线相信大家日常都用的比较多,常见的用法就是使用 border-style 控制不同的样式,比如设置如下边框代码: border-style: dotted dashed solid double;这将设置顶部的边框样式为点状,右边的边框样式为虚线,底部的边框样…...
QString与QByteArray互相转换的方法
QString与QByteArray互相转换的方法 [1] QString与QByteArray互相转换的方法QString转QByteArray方法QByteArray转QString方法QByteArray类同样不以’\0’为结尾QByteArray转QString,主要用buf.toHex()即可 [2] Qt开发串口通讯软件中的数据转换问题1.读取串口命令-Q…...
Springboot +Flowable,设置流程变量的方式(一)
一.简介 为什么需要流程变量。 举个例子,假设有如下一个流程,截图如下: 这是一个请假流程,那么谁请假、请几天、起始时间、请假理由等等,这些都需要说明,不然领导审批的依据是啥?那么如何传递…...
机器学习13(正则化)
文章目录 简介正则化经验风险和结构风险过拟合正则化建模策略 逻辑回归逻辑回归评估器 练习评估器训练与过拟合实验评估器的手动调参 简介 这一节详细探讨关于正则化的相关内容,并就 sklearn 中逻辑回归(评估器)的参数进行详细解释由于 skle…...
并发编程学习(十一):原子数组、
1、数组类型的原子类 原子数组类型,这个其实和AtomicInteger等类似,只不过在修改时需要指明数组下标。 CAS是按照来根据地址进行比较。数组比较地址,肯定是不行的,只能比较下标元素。而比较下标元素,就和元素的…...
递归到动态规划:省去枚举行为
如果在动态规划的过程中没有枚举行为,那严格位置依赖和傻缓存的方式并没有太大区别,但是当有枚举行为的时候(一个位置依赖于多个位置),那严格位置依赖是有优化空间的,枚举行为也许可以省去,题目…...
服务(第二十一篇)mysql高级查询语句(二)
①视图表: 视图表是虚拟表,用来存储SQL语句的定义 如果视图表和原表的字段相同,是可以进行数据修改的; 如果两者的字段不通,不可以修改数据。 语法: 创建:create view 试图表名 as ... 查…...
MYSQL高可用配置(MHA)
1、什么是MHA MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…...
单精度浮点数与十进制数据相互转换
一、float基础: Float类型占4个字节,也就是32bit,其中最高位是符号位,2~9位是指数位,后边的23bit是数值位.如下所示 大部分数据的二进制形式都可以用科学计数法表示,即1.m*2^n这种形式,只要知道m和n,就能确定一个数值 二、小数位如何转变为二进制: 下面…...
PMP敏捷-4大价值观、12原则
宣言及4大价值观 个体及互动 胜于 流程和工具 以人为本 工作的软件 胜于 完整的文档 以价值为导向 客户合作 胜于 合同谈判 合作共赢 应对变更 胜于 遵循计划 拥抱变化 12原则 工作原则:精益、至简,实现这种原则的方式是“定期反省”。9、10、12 …...
别光看公式了!用Multisim 14.0手把手仿真这8个经典运放电路(附工程文件)
别光看公式了!用Multisim 14.0手把手仿真这8个经典运放电路(附工程文件) 在电子工程的学习过程中,运算放大器(Op-Amp)无疑是一个让人又爱又恨的存在。爱的是它强大的功能和广泛的应用,恨的是那些…...
别再手动复制粘贴了!用CubeMX一键生成FreeRTOS工程(STM32F4 HAL库实战)
告别繁琐配置:STM32CubeMXFreeRTOS全自动工程生成指南 在嵌入式开发领域,时间就是竞争力。传统FreeRTOS移植需要手动复制文件、配置路径、修改中断向量表,稍有不慎就会陷入头文件缺失、链接错误的泥潭。现在,STM32CubeMX的图形化…...
Flash闪存技术
1 Mask ROM Cartridges: ROM卡带, Character ROM (CHR ROM) and the Program ROM (PRG ROM). Both of them are Mask ROM. SRAM or EEPROM: game status saving. Moto 6502: 6502 -> ST7 -> STM82 HDD Low-level formatting 低级格式化历史:HDD一个完整扇区包…...
OpenGL 3D项目避坑指南:从贴图资源获取到交互菜单设计,我的CPT205大作业复盘
OpenGL 3D项目避坑指南:从贴图资源获取到交互菜单设计 当第一次接触OpenGL 3D项目时,许多计算机图形学学习者都会陷入相似的困境——如何在有限时间内完成一个既美观又功能完整的作品?本文将以CPT205课程大作业为例,分享从资源获取…...
一键部署MedGemma:打造个人医学AI研究环境
一键部署MedGemma:打造个人医学AI研究环境 1. 为什么需要医学AI研究环境 在医学影像分析领域,研究人员常常面临两个主要挑战:一是缺乏高效的工具来快速验证新的AI模型在医学影像上的表现,二是需要一个直观的界面来展示和解释AI的…...
破解Swin Transformer部署困境:从环境适配到性能突围的全维度方案
破解Swin Transformer部署困境:从环境适配到性能突围的全维度方案 【免费下载链接】Swin-Transformer This is an official implementation for "Swin Transformer: Hierarchical Vision Transformer using Shifted Windows". 项目地址: https://gitcod…...
vLLM-v0.17.1效果展示:多模型并发下99%请求延迟<500ms
vLLM-v0.17.1效果展示:多模型并发下99%请求延迟<500ms 1. vLLM框架核心能力 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,其最新版本v0.17.1在多模型并发场景下实现了99%请求延迟低于500ms的惊人表现。这个最初由加州大学伯克利分校天…...
OpenClaw+Qwen3.5-9B实战:5步完成本地AI助手部署与飞书接入
OpenClawQwen3.5-9B实战:5步完成本地AI助手部署与飞书接入 1. 为什么选择OpenClawQwen3.5-9B组合? 去年冬天,当我第5次因为忘记整理会议录音而被领导提醒时,终于决定给自己找个"数字助理"。在尝试了多个自动化工具后&…...
VS Code Markdown All in One与其他扩展的完美集成指南 [特殊字符]
VS Code Markdown All in One与其他扩展的完美集成指南 🚀 【免费下载链接】vscode-markdown Markdown All in One 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-markdown VS Code Markdown All in One扩展是Visual Studio Code中最强大的Markdown编…...
LeetCodehot100-25 K 个一组翻转链表
class Solution { public:ListNode* reverseKGroup(ListNode* head, int k) {if (head nullptr || k 1) return head;ListNode dummy(0);dummy.next head;ListNode* prev &dummy; // 指向待反转组的前一个节点while (true) {// 检查剩余节点是否够k个ListNode* tail …...
