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.hqwc.cn/news/62844.html

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

相关文章

Golang struct 结构体指针类型 / 结构体值类型

struct类型的内存分配机制 结构体变量之间的赋值是值拷贝。 type stu struct {Name stringSlice []stringMap1 map[string]string }func main() {s : stu{}s.Slice make([]string, 6)s.Slice[1] "ssss"s.Slice[2] "xxxx"s.Map1 make(map[string]stri…

Golang函数以及函数和方法的区别

在接触到go之前&#xff0c;我认为函数和方法只是同一个东西的两个名字而已&#xff08;在我熟悉的c/c&#xff0c;python&#xff0c;java中没有明显的区别&#xff09;&#xff0c;但是在golang中者完全是两个不同的东西。官方的解释是&#xff0c;方法是包含了接收者的函数。…

qiankun-微前端--vue2

项目结构 主应用技术&#xff1a; vue2 子应用技术&#xff1a;vue2 项目目录 这里是特意将主子项目分开来的&#xff0c;方便管理 主应用 安装 qiankun npm install qiankun重新定义一个启动端口&#xff0c;防止和其它子应用共用同一个端口&#xff08;vue.config.js&…

哨兵2号在SNAP中去云处理

1.Fmask软件对1C级产品进行处理&#xff0c;识别像素类别 不知道Fmask是什么可以先去百度一下 软件下载,链接到github地址 我下载的是4.5版本&#xff0c;无脑安装即可。 双击打开软件&#xff08;需要等一会&#xff09;&#xff0c;长这样 路径选择E:\S2\S2A_MSIL1C_20220…

SAP MM学习笔记17-在库品目评价中的标准原价 S 和移动平均价格 V

SAP中有2种价格&#xff0c;标准原价 S 和 移动平均价格 V。 1&#xff0c;标准原价 S 2&#xff0c;移动平均价格 V 在MM03 会计1 Tab中&#xff0c;现行评价区域中&#xff0c;有原价管理区分。 比如下面这个物料 100-100&#xff0c; 它的原价管理区分是 S。 它的合计额…

怎么用PS的魔术棒抠图?PS魔术棒抠图的操作方法

使用PS的魔术棒抠图教程&#xff1a; 1、首先&#xff0c;在ps界面上方点击“文件”选项&#xff0c;再在其弹出的选项栏中选择“打开”选项。然后&#xff0c;打开你所需要的图片。 2、然后&#xff0c;单击左侧的“魔术棒”工具。 3、然后&#xff0c;用鼠标点击图片的背景&…

C++初阶语法——类型指示符auto和空指针nullptr

前言&#xff1a;本篇文章的重点 1.C中的类型指示符auto 2.借由auto实现的范围for 3.C为什么要创建nullptr而不是用原本的NULL。 目录 一.auto1.auto的含义及使用2.auto使用注意事项3.范围for&#xff08;重头戏&#xff09;范围for注意事项 二.nullptr 一.auto 1.auto的含义及…

C语言学习系列-->看淡指针(1)

文章目录 一、概述二、指针变量和地址2.1 取地址操作符2.2 指针变量和解引用操作符2.2.1 指针变量2.2.2 拆解指针类型2.2.4 解引用操作符 2.3 指针变量的大小 三、指针变量的意义3.1 指针的解引用指针-整数 四、 const修饰指针五、指针运算5.1 指针- 整数5.2 指针-指针5.3 指针…

山东布谷科技直播平台搭建游戏开发技术分享:数据存储的重要意义

在市场上的热门的直播平台中&#xff0c;有很多小程序为用户提供各种各样的功能&#xff0c;这其中就有很多游戏小程序&#xff0c;当今社会独生子女众多&#xff0c;很多作为独生子女的用户都会去选择一个能够社交互动的APP来填补内心的空虚&#xff0c;而直播平台的实时互动的…

低代码助力传统制造业数字化转型策略

随着制造强国战略逐步实施&#xff0c;制造行业数字化逐渐进入快车道。提高生产管理的敏捷性、加强产品的全生命周期质量管理是企业数字化转型的核心诉求&#xff0c;也是需要思考的核心价值。就当下传统制造业的核心问题来看&#xff0c;低代码是最佳解决方案&#xff0c;那为…

【从零开始学习JAVA | 第四十五篇】反射

目录 前言&#xff1a; ​反射&#xff1a; 使用反射的步骤&#xff1a; 1.获取阶段&#xff1a; 2.使用阶段&#xff1a; 反射的应用场景&#xff1a; 使用反射的优缺点&#xff1a; 总结&#xff1a; 前言&#xff1a; Java中的反射是一项强大而灵活的功能&#xff0…

安装Qt选择组件

最近在做Qt相关的开发&#xff0c;首先搭建开发环境&#xff0c;刚开始对组件这块不是很熟悉&#xff0c;需要了解这方面的知识&#xff0c;写下来主要是方便记住关于选择组件的说明&#xff0c;Qt版本是最新的长期维护版本&#xff0c;版本号&#xff1a;6.5.2 一、选择要安装…