• QT 自定义信号


    自定义信号,需要
    1.在singnals:区域下写信号函数,以及函数对应的参数
    2. 需要emit关键字进行发射信号
    3. 在需要处理该信号的其他类中,建立信号和其信号槽函数connect()
    4. 在其他类中创建信号处理槽函数

    #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); // 发起信号
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    #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();
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
  • 相关阅读:
    Go学习值reflect反射篇
    RobotFramework入门(一)简要介绍及使用
    手机号码携号转网查询保障用户权益、信息透明、优化用户体验
    postgresql源码学习(39)—— 崩溃恢复① - Startup进程的三大作用
    代码随想录1刷—二叉树篇(二)
    初级篇—第二章SELECT查询语句
    前端笔记-关于元素定位的深度理解
    Python 如何使用 MySQL 8.2 读写分离?
    R 和 Python用于统计学分析,哪个更好?
    软件自动化测试代码覆盖率
  • 原文地址:https://blog.csdn.net/CodeHouse/article/details/132762936