QTread多线程结合自定义信号
控件设计

服务端:
myThread.h
//新建线程头文件,并继承QThread
class myThread : public QThread
{
Q_OBJECT
public:
//构造函数传入Socket
explicit myThread(QTcpSocket *s);
void run();
signals:
//自定义线程信号
void sendToWidget(QByteArray ba);
public slots:
void clientInfoSlot();
private:
QTcpSocket *socket;
};
Widget.h
private slots:
//服务端触发槽函数
void newClientHandler();
//线程触发槽,这里必须带参接收传过来的自定义信号
void threadToSlot(QByteArray ba);
private:
Ui::Widget *ui;
QTcpServer *server;
myThread.cpp
myThread::myThread(QTcpSocket *s)
{
//赋值当前Socket
socket = s;
}
//重写run
void myThread::run(){
//进入线程的Socket触发槽
connect(socket,&QTcpSocket::readyRead,this,&myThread::clientInfoSlot);
}
void myThread::clientInfoSlot(){
//获取客户端发送内容
QByteArray ba = socket->readAll();
//把内容通过自定义信号传回给主体窗口槽
emit sendToWidget(ba); //emit 实现跨类,跨ui,跨线程 信号传送
}
Widget.cpp
void Widget::newClientHandler(){
//获取客户端
QTcpSocket *socket = server->nextPendingConnection();
//显示客户端地址
ui->ipLine->setText(socket->peerAddress().toString());
//显示客户端端口号
ui->portLine->setText(QString::number(socket->peerPort()));
/*
*到此处逻辑和上篇《QTcp网络通讯》一样,以下改用多线程通讯
*/
// 启动线程
myThread *t = new myThread(socket); //创建线程对象
t->start(); //开始线程,触发run
//线程自定义信号触发threadToSlot
connect(t,&myThread::sendToWidget,this,&Widget::threadToSlot);
}
void Widget::threadToSlot(QByteArray ba){
//显示在文本框
ui->messageL->setText(QString(ba));
}
浙公网安备 33010602011771号