您的位置:首页 > 游戏 > 手游 > 【qt】自定义信号

【qt】自定义信号

2024/9/24 19:19:26 来源:https://blog.csdn.net/yyqzjw/article/details/141455197  浏览:    关键词:【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));}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com