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

【qt】自定义信号

我们在上篇中,服务器收到的消息是由线程类去处理的,消息在线程类中,传不到widget中的ui中去,如果我们要在界面显示客户端的消息,必须通过自定义信号.

1.构建信号

在这里插入图片描述
当线程收到信息,就会被填充在ba中,然后sendtowidget函数在接收到ba参数的时候就会发出信号给widget,为什么会发送信号给widget,我们可以在widget中写一个connect联系起来,如下图
在这里插入图片描述

2.演示

自定义信号

3.代码实现

qtthread.h

#ifndef QTTHREAD_H
#define QTTHREAD_H#include <QObject>
#include<QThread>
#include<QTcpSocket>
#include<QDebug>class qtthread : public QObject
{Q_OBJECT
public:explicit qtthread(QTcpSocket*s,QObject *parent = nullptr);void run();void serverrecv();signals:void sendtowidget(QByteArray t);
private:QTcpSocket* s;};#endif // QTTHREAD_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTcpSocket>
#include<QTcpServer>
#include<qtthread.h>
//#include<QThread>
#define PORT 8080
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
private slots:void deal();// void serverrecv();void threaddeal(QByteArray st);private:Ui::Widget *ui;QTcpServer *server;
};
#endif // WIDGET_H

qtthread.cpp

#include "qtthread.h"qtthread::qtthread(QTcpSocket *socket, QObject *parent) : QObject(parent)
{s=socket;
}
void qtthread :: run()
{connect(s,&QTcpSocket::readyRead,this,&qtthread::serverrecv);}
void qtthread ::serverrecv()
{// qDebug()<<s->readAll();QByteArray ba=s->readAll();emit sendtowidget(ba);}

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);server=new QTcpServer;server->listen(QHostAddress::AnyIPv4,PORT);connect(server,&QTcpServer::newConnection,this,&Widget::deal);
}Widget::~Widget()
{delete ui;
}
void Widget::deal()
{QTcpSocket* socket=server->nextPendingConnection();ui->clientip->setText(socket->peerAddress().toString());ui->clientport->setText(QString::number(socket->peerPort()));// connect(socket,&QTcpSocket::readyRead,this,&Widget::serverrecv);qtthread *st=new qtthread(socket);st->run();connect(st,&qtthread::sendtowidget,this,&Widget::threaddeal);}
//void Widget::serverrecv()
//{//    QTcpSocket* socket=(QTcpSocket*)sender();
//   // socket->readAll();//QBytearray
//    ui->recvinfo->setText(QString(socket->readAll()));//}
void Widget::threaddeal(QByteArray st)
{ui->recvinfo->setText(QString(st));}

http://www.mrgr.cn/news/6683.html

相关文章:

  • LLM 压缩之二: ShortGPT
  • swift微调Qwen-7B大模型
  • Unity读取Android本地图片
  • SX_UNIX套接字通信_15
  • 【opencv】SIFT(尺度不变特征变换)算法?
  • 【自动化】考试答题自动化完成答案,如何实现100%正确呢
  • 特殊管道资源采购
  • 【JetPack】LiveData setValue和postValue的区别
  • openjdk11 jvm视角查看java线程异常退出synchronized锁自动释放
  • 深入解析ASP.NET Core 中间件:如何构建高效的请求处理管道
  • 七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
  • 谷粒商城实战笔记-248-商城业务-消息队列-RabbitMQ简介
  • MongoDB快速入门CRUD
  • Docker 部署loki日志 用于微服务
  • 《通义千问AI落地—下》:WebSocket详解
  • 使用nginx做代理转发
  • 区块链基础通识(1)——分布式系统的共识问题
  • easyexcel--多sheet页导入导出
  • 使用[KafkaStreams流计算框架实时计算产生报警(升级报警)
  • Xmind 在线导图上线!多设备实时同步,节约本地空间