Qt 多线程

一、注意事项: 线程处理类继承于 QObject 线程处理类对象不能有父对象 处理完成后向外发信号 即使 QThread 线程内部的处理对象运行结束了,QThread 线程对象也不会自动释放,需要手动 quit() + wait() 线程处理类对象创建成功后,需要通过 moveToThread() 函数移动到 QThread 对象中 需要通过其他线程发信号来启动另外线程中的处理类对象的处理函数 子线程中不要操作图形界面 二、connect 第五个参数的作用 指定信号和槽的连接方式:自动连接、直接连接、队列连接,多线程时才有意义,默认为 Qt::AutoConnection。 Qt::AutoConnection(自动连接):多线程时是 Qt::QueuedConnection(队列连接),单线程时是 Qt::DirectConnection(直接连接) Qt::QueuedConnection(队列连接):槽函数所在线程和信号接收者所在线程相同 Qt::DirectConnection(直接连接):槽函数所在线程和信号发送者所在线程相同 三、代码示例 线程处理类 class MyThreadPro : public QObject { Q_OBJECT public: explicit MyThreadPro(QObject *parent = nullptr); // 后台处理函数 void startProcessing(); // 是否结束标识位 void setFlag(bool b = false); signals: // 向其他线程发送信号 void myTimeout(); private: bool stopRunning; }; 主窗口类...

July 18, 2022 · 1 min · Rick Cui

Qt UDP

一、总结 UDP 就像写信,可能会丢包 Linux UDP 通信过程 Qt UDP 通信过程 支持多路组播:D 类地址 局域网广播 IP: 255.255.255.255 二、每个实例都可以是服务端 只需要一个套接字,绑定到端口号即可 setWindowTitle(QString("服务器端口为:%1").arg(port)); udpSocket = new QUdpSocket(this); // 只需要绑定端口号,不用开启监听 udpSocket->bind(port); connect(udpSocket, &QUdpSocket::readyRead,[=](){ char buf[1024] = {0}; QHostAddress clientAddr; // 发送方 IP quint16 clientPort; // 发送方 Port qint64 len = udpSocket->readDatagram(buf, sizeof (buf), &clientAddr, &clientPort); qDebug() << "接收到" << len; if(len > 0){ QString str = QString("[%1:%2] %3")....

July 15, 2022 · 1 min · Rick Cui

Qt TCP

一、总结 TCP 就像打电话,安全,不会丢包 Linux TCP 通信 Qt TCP 通信 二、服务器端 TCP 服务器端有两个套接字,一个是监听套接字,一个是通信套接字 tcpServer = nullptr; // 服务监听套接字 tcpSocket = nullptr; // 通信套接字 // 创建tcp服务监听套接字 tcpServer = new QTcpServer(this); // tcp服务开启监听(bind端口号并开启监听) tcpServer->listen(QHostAddress::Any, 8008); // 绑定连接成功信号 connect(tcpServer, &QTcpServer::newConnection,[=](){ // 获取通信套接字 tcpSocket = tcpServer->nextPendingConnection(); // 获取客户端 IP 和 端口 QString ip = tcpSocket->peerAddress().toString(); quint16 port = tcpSocket->peerPort(); QString msg = QString("[%1:%2] 连接成功")....

July 15, 2022 · 1 min · Rick Cui

Qt CMake

cmake_minimum_required(VERSION 3.5)project(07_TCP LANGUAGES CXX)# 将编译目录包含到Include目录 set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOUIC ON)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)# 根据 Qt 版本的环境变量,设置使用的 Qt 版本 set(CMAKE_PREFIX_PATH $ENV{QTDIR5141_64})set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED ON)# QtCreator supports the following variables for Android, which are identical to qmake Android variables. # Check http://doc.qt.io/qt-5/deployment-android.html for more information. # They need to be set before the find_package(Qt5 ...) call. #if(ANDROID) # set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") # if (ANDROID_ABI STREQUAL "armeabi-v7a") # set(ANDROID_EXTRA_LIBS # ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so # ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so) # endif() #endif() # 工程中会用到的Qt模块 find_package(Qt5 COMPONENTS Widgets Network REQUIRED)if(ANDROID) add_library(07_TCP SHARED main....

July 15, 2022 · 1 min · Rick Cui

Qt 信号和槽

信号函数没有返回值,且只是一个函数声明,必须有 signals: 声明 槽函数的函数标签必须和信号函数相同(相同的返回值类型和形参列表) Qt5 后成员函数也可作为 slots,可以不用 slots: 声明 slots: 声明前要添加访问权限修饰符 信号函数和槽函数其实都可以被重载 // signal 和 slots 都可以重载 // Qt5的方式 void(subWindow::*pFun1)() = &subWindow::showMainWindow; void(MainWindow::*pSlot1)() = &MainWindow::onShowMainWindow; connect(&sw, pFun1, this, pSlot1); void(subWindow::*pFun2)(int,QString) = &subWindow::showMainWindow; void(MainWindow::*pSlot2)(int,QString) = &MainWindow::onShowMainWindow; connect(&sw, pFun2, this, pSlot2); // Qt4的方式 // 1. SIGNAL、SLOT宏会把信号和槽转成字符串,所以就不能进行编译期错误检查 // 2. 槽函数前面必须有 slots 标签,否则无法识别为槽函数 connect(&sw, SIGNAL(showMainWindow()), this, SLOT(onShowMainWindow())); connect(&sw, SIGNAL(showMainWindow(int,QString)) , this, SLOT(onShowMainWindow(int,QString))); // Lambda 表达式 void(subWindow::*pFun1)() = &subWindow::showMainWindow; connect(&sw, pFun1, [](){ qDebug()<<"没有参数的信号"; } ); void(subWindow::*pFun2)(int,QString) = &subWindow::showMainWindow; connect(&sw, pFun2, [](int a, QString msg){ qDebug()<<a<<msg; } ); // Lambda 表达式使用注意事项 // 如果b3是局部变量或者成员变量,lambda不要使用引用传值 QPushButton *b3 = new QPushButton(this); b3->setText("Lambda"); int a = 10, b = 100; connect(&b2/*b3*/, &QPushButton::clicked, [=](){ // 此处使用 & 传值会有问题 qDebug()<<a<<b; } );

June 14, 2022 · 1 min · Rick Cui