自定义信号,需要
1.在singnals:区域下写信号函数,以及函数对应的参数
2. 需要emit关键字进行发射信号
3. 在需要处理该信号的其他类中,建立信号和其信号槽函数connect()
4. 在其他类中创建信号处理槽函数文章来源地址https://www.toymoban.com/news/detail-703796.html
#include "mythread.h"
myThread::myThread(QTcpSocket *s)
{
socket = s;
}
// 对线程的run方法进行重写, 相当于线程处理函数
void myThread::run() {
// 启动线程后,应该建立连接,关于readyRead
connect(socket, &QTcpSocket::readyRead, this, &myThread::clientInfoHandler);
}
void myThread::clientInfoHandler(){
// 线程不能对ui进行操作,只能在创建和ui同名的wiget类中操作
// qDebug()<< socket->readAll();
// 所以需要在thread中自定义信号,在wiget中用于触发信号和对应槽函数
QByteArray b = socket->readAll();
emit sendToWidget(b); // 发起信号
}
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 服务端有QTcpServer库,封装了监听操作
server = new QTcpServer();
// 直接监听,内部根据传入的ip和端口进行绑定
server->listen(QHostAddress::AnyIPv4, SERVER_PORT);
// 对server进行新的连接信号建立信号槽
connect(server, &QTcpServer::newConnection, this, &Widget::newClientHandler);
}
Widget::~Widget()
{
delete ui;
}
void Widget::newClientHandler()
{
// 将获取到的新的连接套接字中获取客户端ip和端口
socket = server->nextPendingConnection();
ui->hostLineEdit->setText(socket->peerAddress().toString());
ui->portLineEdit->setText(QString::number(socket->peerPort()));
// 新的消息到来时,connect 数据read和处理信号槽函数
// connect(socket, &QTcpSocket::readyRead, this, &Widget::clientInfoSlot);
// 创建线程,来一个连接后,就创建一个线程,在线程中进行socket的数据接收
myThread* thread = new myThread(socket);
thread->start();
// thread线程对象发出信号,widget中建立对应的槽函数
connect(thread, &myThread::sendToWidget, this, &Widget::threadMessageSlot);
}
void Widget::threadMessageSlot(QByteArray b){
ui->chatLineEdit->setText(QString(b));
}
void Widget::clientInfoSlot()
{
ui->chatLineEdit->setText(QString(socket->readAll()));
}
void Widget::on_closeButton_clicked()
{
socket->close();
}
文章来源:https://www.toymoban.com/news/detail-703796.html
到了这里,关于QT 自定义信号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!