CMake+QT+大漠插件的桌面应用开发(QThread)
简介
-
在CMake+QT+大漠插件的桌面应用开发中已经给出了QT配合大漠插件开发桌面应用的样例
-
不过由于主窗口的UI操作和大漠的调用是在一个线程里面的,所以当大漠调用时间过长时会出现UI界面卡顿的现象
-
我们可以利用子线程处理耗时操作,处理完后再由主线程(UI线程)更新界面,这样界面就不会出现卡顿。
-
在这里,我们将会用到QThread,调整后的QT主线程与子线程交互逻辑图如下:
-
交互逻辑描述
- 当点击“注册”选项时,会发出
regDM
信号,子线程接收到该信号会执行MyMainWorker中的doRegDM
方法,执行完成后会发出regDMReady
信号,主线程接收到该信号会执行更新UI的操作 - 当点击“搜索”按钮时,同理
- 当点击“截图”按钮时,同理
- 当点击“注册”选项时,会发出
环境
版本/规范 | 备注 | |
---|---|---|
平台 | win32 | 操作系统为Windows10 |
CMake | 3.27.8 | CLion自带 |
C++ | 17 | |
Toolchain | VisualStudio 2022 | 只用其工具链,记得先安装好 |
QT | 5.12.12 | 安装时选择msvc2017,不要64位的 |
DM | 7.2353 | |
CLion | 2023.3.2 | 你也可以用其他IDE工具 |
- 启动IDE时,记得以管理员模式启动
项目结构
- 新建一个项目 qt_dm_demo_x_02
- 目录同CMake+QT+大漠插件的桌面应用开发中一致,会多出MyMainWorker,用于处理子线程逻辑
qt_dm_demo_x_02 # 项目目录
-- ......
--MyMainWorker.cpp
--MyMainWorker.h
-- ......
配置编译环境
- 其他同CMake+QT+大漠插件的桌面应用开发中一致
- CMakeLists.txt 文件中生成可执行文件时,会多出MyMainWorker.cpp、MyMainWorker.h
# 生成可执行文件
add_executable(${PROJECT_NAME} main.cpp
strutils.cpp strutils.h
dmutil.cpp dmutil.h
mymainwindow.cpp mymainwindow.h mymainwindow.ui
MyMainWorker.cpp MyMainWorker.h
)
代码
- dmutil.h、dmutil.cpp、strutils.h、strutils.cpp、mymainwindow.ui、main.cpp同CMake+QT+大漠插件的桌面应用开发中一致
- mymainwindow.h
#ifndef QT_DM_DEMO_X_MYMAINWINDOW_H
#define QT_DM_DEMO_X_MYMAINWINDOW_H
#include <QMainWindow>
#include <QTextEdit>
#include <QThread>
#include "dmutil.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class MyMainWindow; }
QT_END_NAMESPACE
class MyMainWindow : public QMainWindow {
Q_OBJECT
QThread workerThread;
public:
explicit MyMainWindow(QWidget *parent = nullptr);
~MyMainWindow() override;
public:
void showInfo(const QString &message, const QString &title = "提示");
void showWarn(const QString &message, const QString &title = "告警");
signals:
void regDM(Idmsoft **pDm);
void findWindow(Idmsoft *pDm, const QString &title);
void captureWindow(Idmsoft *pDm, const long hwnd);
public slots:
void showMessageBox(bool result, const QString &message);
void showTable(bool result, const QString &msg, const vector<MyWindow> &windowVec);
private:
Ui::MyMainWindow *ui;
Idmsoft *pCommonDm = nullptr;
};
#endif //QT_DM_DEMO_X_MYMAINWINDOW_H
- mymainwindow.cpp
// You may need to build the project (run Qt uic code generator) to get "ui_MyMainWindow.h" resolved
#include <QFont>
#include <QHeaderView>
#include <QMessageBox>
#include <QPushButton>
#include <QAction>
#include <QString>
#include <QTableWidgetItem>
#include <QObject>
#include <QVector>
#include <iostream>
#include "mymainwindow.h"
#include "ui_MyMainWindow.h"
#include "MyMainWorker.h"
using namespace std;
MyMainWindow::MyMainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MyMainWindow) {
ui->setupUi(this);
qRegisterMetaType<QVector<int>>