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));
}
posted on 2026-06-04 15:29  薄观厚积  阅读(10)  评论(0)    收藏  举报