Qt 7. 在自定义类TcpClient类中使用信号槽功能

1. 因为只有QObject类及其子类派生的类才能使用信号和槽机制。

使用信号和槽还必须在类声明的最开始处添加Q_OBJECT宏,在这个程序中,类的声明是自动生成的,已经添加了这个宏。UI类继承自QDialog,QDialog类又继承自QWidget类,QWidget类是QObject类的子类,所以可以使用信号和槽。
在这里插入图片描述

//tcpclient.h
#ifndef TCPCLIENT_H
#define TCPCLIENT_H#include <QTcpSocket>
//#include "ex2.h"
#include "ui_ex2.h"class Ex2;      // 声明类
class TcpClient : public QObject
{Q_OBJECT
public:TcpClient(Ex2 *parent);~TcpClient();bool Connect(QString ip,int port,int timeout);bool DisConnect();void Test();void Send(char *buf,int length);void Receive();QString ByteArrayToHexString(QByteArray buf);QTcpSocket *socket;
private:Ex2 *pUi;
};#endif // TCPCLIENT_H
2. 槽就是普通的C++函数,可以像一般的函数一样使用,槽的最大特点就是可以和信号关联。QObject::connect()这个函数connect(sender, signal, receiver, slot);

在这里插入图片描述

//tcpclient.cpp
#include "tcpclient.h"
#include "ex2.h"TcpClient::TcpClient(Ex2 *parent)
{socket = new QTcpSocket();pUi = parent;//连接信号槽connect(socket, &QTcpSocket::readyRead, this, &TcpClient::Receive);
}TcpClient::~TcpClient()
{delete socket;
}bool TcpClient::Connect(QString ip,int port,int timeout)
{socket->abort();//连接服务器socket->connectToHost(ip, port);if(socket->waitForConnected(timeout)){return true;}else{return false;}
}bool TcpClient::DisConnect()
{socket->disconnectFromHost();return true;
}void TcpClient::Send(char *buf,int length)
{socket->write(buf,length);socket->flush();
}//12 34 A1 A2 -> "12 34 A1 A2"
QString TcpClient::ByteArrayToHexString(QByteArray data)
{QString ret(data.toHex().toUpper());int len = ret.length()/2;for(int i=1;i<len;i++){ret.insert(2*i+i-1," ");}return ret;
}void TcpClient::Receive()
{QByteArray buffer;//读取缓冲区数据buffer = socket->readAll();QString str0 = ByteArrayToHexString(buffer) +" ";if(!buffer.isEmpty()){QString str = pUi->ui->textEditMy1->toPlainText();str += str0;//刷新显示pUi->ui->textEditMy1->setText(str);}
}void TcpClient::Test()
{pUi->ui->textEditMy1->setText("Test");
}
//Ex2.cpp
void Ex2::on_pushButtonTcpConnect_clicked()
{if(ui->pushButtonTcpConnect->text()==tr("连接")){if(tcpClientSocket->Connect(ui->lineEditIP->text(),ui->lineEditPort->text().toInt(),2000) == true){ui->pushButtonTcpConnect->setText("断开");
//            connect(tcpClientSocket->socket,&QObject::readyRead,this,&tcpClientSocket::Receive);}}else{tcpClientSocket->DisConnect();ui->pushButtonTcpConnect->setText("连接");}
}
void Ex2::on_pushButtonTcpSend_clicked()
{//获取文本框内容并以ASCII码形式发送uchar buf[3];buf[0] = 0x11;buf[1] = 0x22;buf[2] = 0x33;tcpClientSocket->Send((char *)buf,3);
}
//Ex2.h
#ifndef EX2_H
#define EX2_H#include <QDialog>#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include "tcpclient.h"QT_BEGIN_NAMESPACE
namespace Ui { class Ex2; }
QT_END_NAMESPACEclass Ex2 : public QDialog
{Q_OBJECTpublic:Ex2(QWidget *parent = nullptr);~Ex2();Ui::Ex2 *ui;TcpClient *tcpClientSocket;private slots:void on_pushButtonMy1_clicked();void on_pushButtonMy2_clicked();void on_pushButtonClr_clicked();void on_pushButtonComm_clicked();void on_sendButton_clicked();void Read_Data();void on_openButton_clicked();void on_pushButtonTcpConnect_clicked();void on_pushButtonTcpSend_clicked();private://Ui::Ex2 *ui;QSerialPort *serial;
};
#endif // EX2_H
3. 实践证明上述代码,通过上述可以实现接收到TCP数据(readyRead()函数)后,通过TcpClient类的Receive()函数处理。可以把TCP数据的收发都封装在TcpClient类中。
4. 列举一下使用信号和槽应该注意的几点:

需要继承自QObject或其子类;
在类声明的最开始处添加Q OBJECT宏;
槽中参数的类型要和信号参数的类型相对应,且不能比信号的参数多;
信号只用声明,没有定义,且返回值为void类型。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据链路层

数据链路层和网络层的对比 如果说网络层实现的是路由的功能&#xff0c;那么数据链路层就是实打实的实现具体的传输。 就像导航&#xff0c;网络层告诉我们下一步该去哪个主机&#xff0c;而数据链路层则是实现去下一个主机的方法。 网络层的IP地址告诉我们目的地在哪里&#x…

如何使用CSS实现一个纯CSS的滚动条样式?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现自定义滚动条样式⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣…

每天一道leetcode:797. 所有可能的路径(图论中等深度优先遍历)

今日份题目&#xff1a; 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节…

VBA manual

VBA MACRO Debug.Print()设置Macros安全修复乱码打开VBAAlt F11File/Options/Customize Ribbon Debug.Print() How to Use Excel VBA Debug. Print? 设置Macros安全 或者 File /Options 如果还是Block&#xff0c;右键文件属性 修复乱码 Tools / Options Control Pann…

大数据Flink(六十一):Flink流处理程序流程和项目准备

文章目录 Flink流处理程序流程和项目准备 一、Flink流处理程序的一般流程

java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration

错误&#xff1a; java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfigurationat org.apache.hadoop.hive.ql.exec.tez.TezSessionPoolSession$AbstractTriggerValidator.startTriggerValidator(TezSessionPoolSession.java:74)at org.apache.hadoop.hive.ql.e…

day 0815

计算文件有多少行&#xff1f; 2.文件的拷贝

21.0 CSS 介绍

1. CSS层叠样式表 1.1 CSS简介 CSS(层叠样式表): 是一种用于描述网页上元素外观和布局的样式标记语言. 它可以与HTML结合使用, 通过为HTML元素添加样式来改变其外观. CSS使用选择器来选择需要应用样式的元素, 并使用属性-值对来定义这些样式.1.2 CSS版本 CSS有多个版本, 每个…

髋关节 弹响

评估测试 https://www.bilibili.com/video/BV1A44y1j71Y/?spm_id_from333.880.my_history.page.click&vd_source3535bfaa5db8443d107998d15e88dc44 根据此视频整理所得 托马斯测试 第一种情况 如果你难于将膝关节拉到胸前&#xff0c;并感觉前面有骨性的挤压 说明你股…

leetcode 面试题 02.05 链表求和

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;面试题 02.05 链表求和 ps&#xff1a; 首先定义一个头尾指针 head 、tail&#xff0c;这里的 tail 是方便我们尾插&#xff0c;每次不需要遍历找尾&#xff0c;由于这些数是反向存在的&#xff0c;所以我们直接加起来若…

分布式图数据库 NebulaGraph v3.6.0 正式发布,强化全文索引能力

本次 v3.6.0 版本&#xff0c;主要强化全文索引能力&#xff0c;以及优化部分场景下的 MATCH 性能。 强化 强化增强全文索引功能&#xff0c;具体 pr 参见&#xff1a;#5567、#5575、#5577、#5580、#5584、#5587 优化 支持使用 MATCH 子句检索 VID 或属性索引时使用变量&am…

概述、搭建Redis服务器、部署LNP+Redis、创建Redis集群、连接集群、集群工作原理

Top NSD DBA DAY09 案例1&#xff1a;搭建redis服务器案例2&#xff1a;常用命令限案例3&#xff1a;部署LNPRedis案例4&#xff1a;创建redis集群 1 案例1&#xff1a;搭建redis服务器 1.1 具体要求如下 在主机redis64运行redis服务修改服务运行参数 ip 地址192.168.88.6…

四张图片道清AI大模型的发展史(1943-2023)

四张图片道清AI大模型的发展史(1943-2023) 现在最火的莫过于GPT了&#xff0c;也就是大规模语言模型(LLM)。“LLM” 是 “Large Language Model”&#xff08;大语言模型&#xff09;的简称&#xff0c;通常用来指代具有巨大规模参数和复杂架构的自然语言处理模型&#xff0c;…

从零开始,外贸邮件营销如何做?

邮件营销是外贸企业开发新用户和维系老客户非常有效的方法之一&#xff0c;因其操作方便快捷、成本低廉且精准投放的特性&#xff0c;已成为外贸行业的必备营销手段。但如何才能利用好邮件营销&#xff0c;让邮件营销的作用发挥到最大呢&#xff1f;今天U-Mail李工就跟大家分享…

Python Flask+Echarts+sklearn+MySQL(评论情感分析、用户推荐、BI报表)项目分享

Python FlaskEchartssklearnMySQL(评论情感分析、用户推荐、BI报表)项目分享 项目背景&#xff1a; 随着互联网的快速发展和智能手机的普及&#xff0c;人们越来越倾向于在网上查找餐厅、购物中心、酒店和旅游景点等商户的点评和评分信息&#xff0c;以便做出更好的消费决策。…

vue3+ts使用antv/x6 + 自定义节点

使用 2.x 版本 x6.antv 新官网: 安装 npm install antv/x6 //"antv/x6": "^2.1.6",项目结构 1、初始化画布 index.vue <template><div id"container"></div> </template><script setup langts> import { onM…

数据库概述、部署MySQL服务、必备命令、密码管理、安装图形软件、SELECT语法 、筛选条件

Top NSD DBA DAY01 案例1&#xff1a;构建MySQL服务器案例2&#xff1a;密码管理案例3&#xff1a;安装图形软件案例4&#xff1a;筛选条件 1 案例1&#xff1a;构建MySQL服务器 1.1 问题 在IP地址192.168.88.50主机和192.168.88.51主机上部署mysql服务练习必备命令的使用 …

实习笔记(一)

自定义注解&#xff1a; 自定义注解中有三个元注解Target,Retention,Document /*** 系统日志注解** author Mark sunlightcsgmail.com*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface SysLog {String value() default "…

Qt 之 QPushButton,信号与槽机制

文章目录 前言一、QPushButton二、信号与槽机制总结 前言 一、QPushButton 当我们开发基于Qt框架的图形用户界面&#xff08;GUI&#xff09;应用程序时&#xff0c;经常需要在界面上添加按钮来实现用户交互。Qt提供了一个名为 QPushButton 的类作为按钮控件的实现。QPushButt…

ML-fairness-gym入门教学

1、ML-fairness-gym简介 ML-fairness-gym是一个探索机器学习系统长期影响的工具。可以用于评估机器学习系统的公平性和评估静态数据集上针对各种输入的误差度量的差异。开源网站&#xff1a;GitHub - google/ml-fairness-gym 2、安装ML-fairness-gym&#xff08;Windows&…