1. QT安装概述
QT作为一款跨平台的C++图形用户界面应用程序开发框架,在工业控制、嵌入式系统、金融交易等领域有着广泛应用。对于刚接触QT的开发者来说,安装过程往往会遇到各种环境配置问题。本文将基于多年QT开发经验,详细介绍从下载到配置的完整安装流程,并针对不同操作系统和开发场景提供定制化解决方案。
2. 安装前准备
2.1 系统环境检查
在安装QT前,需要确认系统满足以下基本要求:
- Windows:Windows 7及以上版本,至少4GB内存(推荐8GB),10GB可用磁盘空间
- macOS:10.13及以上版本,Xcode命令行工具已安装
- Linux:Ubuntu 18.04+/CentOS 7+,gcc/g++开发工具链
提示:建议关闭杀毒软件实时防护功能,避免安装过程中组件被误拦截
2.2 安装包获取
QT官方提供两种获取方式:
- 在线安装器(推荐):
- 下载地址:qt.io/download
- 文件大小约50MB,安装时再下载所需组件
- 离线安装包:
- 适用于网络受限环境
- 完整安装包约3-5GB
对于国内用户,建议使用清华镜像源加速下载:
https://mirrors.tuna.tsinghua.edu.cn/qt/3. Windows平台安装详解
3.1 安装步骤
- 运行QT安装程序(qt-unified-windows-x64-4.6.0-online.exe)
- 登录QT账号(需提前注册)
- 选择安装目录(路径不要包含中文和空格)
- 组件选择界面:
- 必选:QT 5.15.2/MSVC 2019 64-bit
- 工具:QT Creator、Debugging Tools for Windows
- 可选:Qt Charts、Qt Data Visualization等扩展模块
3.2 环境变量配置
安装完成后需要手动添加:
PATH: C:\Qt\5.15.2\msvc2019_64\bin QTDIR: C:\Qt\5.15.2\msvc2019_643.3 常见问题解决
安装卡在"Running maintenance tool":
- 删除C:\Users[用户]\AppData\Roaming\Qt
- 以管理员身份重新运行安装程序
编译时报"缺少dll":
- 将对应版本的vc_redist.x64.exe安装包放入系统
4. Linux平台安装指南
4.1 Ubuntu/Debian系安装
通过APT安装基础开发环境:
sudo apt update sudo apt install build-essential libgl1-mesa-dev下载在线安装器并执行:
chmod +x qt-unified-linux-x64-4.6.0-online.run ./qt-unified-linux-x64-4.6.0-online.run4.2 编译环境配置
编辑~/.bashrc添加:
export PATH=/opt/Qt/5.15.2/gcc_64/bin:$PATH export LD_LIBRARY_PATH=/opt/Qt/5.15.2/gcc_64/lib:$LD_LIBRARY_PATH5. macOS安装特别说明
5.1 前置条件
确保已安装:
- Xcode命令行工具(xcode-select --install)
- Homebrew(推荐)
5.2 安装流程
- 下载dmg安装包
- 拖拽QT Creator到Applications目录
- 首次运行需在终端执行:
sudo xattr -r -d com.apple.quarantine /Applications/Qt\ Creator.app
6. 组件定制与扩展安装
6.1 常用模块说明
| 模块名称 | 功能 | 适用场景 |
|---|---|---|
| Qt Charts | 图表绘制 | 金融、监控系统 |
| Qt WebEngine | 浏览器引擎 | 内嵌Web应用 |
| Qt Multimedia | 多媒体处理 | 视频播放器开发 |
| Qt SerialPort | 串口通信 | 工业控制 |
6.2 后期添加组件
通过MaintenanceTool程序:
- 位于QT安装目录下
- 选择"添加或移除组件"
- 勾选需要新增的模块
7. 开发环境验证
7.1 创建测试项目
- 打开QT Creator
- 新建Qt Widgets Application项目
- 构建并运行默认模板
7.2 常见验证问题
界面显示异常:
- Windows平台检查显卡驱动
- Linux平台确认OpenGL支持
中文乱码:
- 在main.cpp添加:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
- 在main.cpp添加:
8. 多版本管理技巧
8.1 版本切换方案
使用qtchooser工具(Linux/macOS):
qtchooser -install qt5.15 /opt/Qt/5.15.2/gcc_64/bin/qmake8.2 并行安装建议
- 将不同版本安装到独立目录
- 通过环境变量切换:
export QT_VERSION=5.15.2 export QTDIR=/opt/Qt/$QT_VERSION/gcc_64
9. 镜像源配置优化
9.1 国内镜像设置
修改安装器的仓库配置:
<Repository> <Url>https://mirrors.tuna.tsinghua.edu.cn/qt/</Url> </Repository>9.2 离线安装包制作
使用QT Installer Framework:
binarycreator -c config.xml -p packages installer10. 疑难问题排查指南
10.1 安装日志分析
关键日志位置:
- Windows: %APPDATA%\Qt\InstallationLog.txt
- Linux/macOS: ~/.config/Qt/qtinstaller.log
10.2 常见错误代码
| 错误码 | 原因 | 解决方案 |
|---|---|---|
| 102 | 网络连接失败 | 检查代理设置 |
| 301 | 空间不足 | 清理目标磁盘 |
| 502 | 权限不足 | 使用管理员权限运行 |
11. 高级配置技巧
11.1 自定义安装路径
通过命令行参数指定:
./qt-installer.run --root /custom/path11.2 静默安装模式
适用于批量部署:
./qt-installer.run --script auto-install.qs12. 安装后优化
12.1 插件配置
在QT Creator中配置:
- 工具→选项→Kits
- 添加对应版本的qmake路径
- 设置调试器路径(如gdb)
12.2 开发环境集成
VS Code配置:
- 安装C++和Qt Tools扩展
- 配置tasks.json调用qmake
CLion配置:
- 使用CMake with Qt
- 设置QT_DIR环境变量
13. 移动开发环境搭建
13.1 Android配置
- 安装JDK 11+
- 下载Android SDK/NDK
- 在QT Creator中配置:
- Android SDK路径
- NDK版本(建议r21e)
13.2 iOS配置
- 确保Xcode已安装
- 配置签名证书
- 设置部署目标版本
14. 容器化开发环境
14.1 Docker部署
使用官方QT镜像:
FROM qt:5.15.2 RUN apt-get update && apt-get install -y \ libgl1-mesa-dev14.2 共享开发配置
通过卷映射:
docker run -v $(pwd):/project -it qt-dev15. 性能优化建议
15.1 编译参数调整
在.pro文件中添加:
QMAKE_CXXFLAGS += -O3 -march=native CONFIG += optimize_full15.2 调试版本配置
使用分离调试信息:
CONFIG += force_debug_info separate_debug_info16. 版本升级策略
16.1 就地升级
通过MaintenanceTool选择:
- 更新→检查更新
- 选择新版本组件
16.2 并行安装
推荐方案:
- 保留旧版本
- 新版本安装到不同目录
- 逐步迁移项目
17. 企业级部署方案
17.1 离线安装包定制
使用QT Installer Framework:
- 准备自定义组件
- 编写config.xml
- 生成可分发安装包
17.2 许可证管理
商业版注意事项:
- 配置许可证服务器
- 设置QT_LICENSE环境变量
- 定期更新许可证文件
18. 安全加固建议
18.1 组件安全审计
- 定期检查CVE公告
- 禁用不必要模块
- 更新到最新补丁版本
18.2 编译安全选项
在.pro文件中添加:
QMAKE_CXXFLAGS += -fstack-protector-strong CONFIG += warn_on19. 持续集成配置
19.1 Jenkins集成
Pipeline示例:
stage('Build') { steps { bat 'qmake && nmake' } }19.2 GitHub Actions
配置示例:
- name: Install Qt uses: jurplel/install-qt-action@v2 with: version: '5.15.2'20. 跨平台开发技巧
20.1 条件编译处理
在代码中使用:
#ifdef Q_OS_WIN // Windows特定代码 #elif defined(Q_OS_MACOS) // macOS特定代码 #endif20.2 资源文件管理
使用QT资源系统:
- 创建.qrc文件
- 添加资源路径
- 通过:/前缀访问
21. 安装验证测试
21.1 基础功能测试
- 创建控制台应用
- 测试基础库链接
- 验证信号槽机制
21.2 图形界面测试
示例测试代码:
QTest::mouseClick(button, Qt::LeftButton); QVERIFY(label->text() == "Clicked");22. 性能基准测试
22.1 启动时间测量
使用QElapsedTimer:
QElapsedTimer timer; timer.start(); // 被测代码 qDebug() << "耗时:" << timer.elapsed() << "ms";22.2 内存占用分析
在.pro文件中启用:
CONFIG += qml_debug23. 文档系统集成
23.1 离线文档安装
- 下载qt-documentation包
- 在QT Creator中配置路径
- 设置默认帮助集合
23.2 自定义文档
使用Doxygen生成:
GENERATE_QHP = YES QHP_NAMESPACE = com.mycompany.docs24. 第三方库集成
24.1 使用vcpkg
安装示例:
vcpkg install qt5-base24.2 Conan包管理
配置conanfile.txt:
[requires] qt/5.15.225. 项目迁移指南
25.1 旧项目升级
- 使用qt5porting工具
- 逐步替换废弃API
- 测试兼容性
25.2 CMake迁移
转换.pro文件:
qt-cmake -S . -B build26. 调试技巧进阶
26.1 核心转储分析
配置系统生成coredump:
ulimit -c unlimited echo "/tmp/core.%e.%p" > /proc/sys/kernel/core_pattern26.2 QML调试
启动参数:
-qmljsdebugger=port:376827. 多语言支持配置
27.1 国际化流程
- 使用tr()标记字符串
- 运行lupdate生成.ts
- 用Linguist翻译
- 发布.qm文件
27.2 动态语言切换
示例代码:
QTranslator translator; translator.load("zh_CN.qm"); qApp->installTranslator(&translator);28. 插件系统开发
28.1 插件接口定义
基础接口类:
class PluginInterface { public: virtual ~PluginInterface() {} virtual void execute() = 0; }; Q_DECLARE_INTERFACE(PluginInterface, "com.mycompany.Plugin")28.2 插件加载机制
动态加载示例:
QPluginLoader loader("myplugin.so"); auto plugin = qobject_cast<PluginInterface*>(loader.instance());29. 自动化测试集成
29.1 单元测试框架
使用QTestLib:
class TestClass : public QObject { Q_OBJECT private slots: void testCase1() { QVERIFY(1 + 1 == 2); } };29.2 UI自动化
使用Squish或Qt Test:
QTest::keyClicks(lineEdit, "test text");30. 部署打包方案
30.1 Windows打包
使用windeployqt:
windeployqt --compiler-runtime myapp.exe30.2 Linux AppImage
创建步骤:
- 准备.desktop文件
- 使用linuxdeployqt
- 生成可执行镜像
31. 性能分析工具
31.1 QML Profiler
启动方式:
-qmljsdebugger=port:3768,services:QmlDebugger,QmlProfiler31.2 内存分析
使用Heob或Valgrind:
valgrind --tool=memcheck ./myapp32. 代码质量保障
32.1 静态分析
使用Clang-Tidy:
clang-tidy -checks=* -p build/compile_commands.json src/*.cpp32.2 代码格式化
配置.clang-format:
BasedOnStyle: Qt AccessModifierOffset: -433. 多线程编程
33.1 QThread使用
正确用法示例:
class Worker : public QObject { Q_OBJECT public slots: void doWork() { // 耗时操作 emit resultReady(); } signals: void resultReady(); };33.2 线程池
使用QThreadPool:
QRunnable* task = new MyTask(); QThreadPool::globalInstance()->start(task);34. 网络编程实践
34.1 HTTP客户端
使用QNetworkAccessManager:
QNetworkRequest request(QUrl("https://example.com")); QNetworkReply* reply = manager->get(request); connect(reply, &QNetworkReply::finished, [=]() { qDebug() << reply->readAll(); });34.2 WebSocket实现
服务端示例:
QWebSocketServer server("MyServer", QWebSocketServer::NonSecureMode); connect(&server, &QWebSocketServer::newConnection, [&]() { QWebSocket* socket = server.nextPendingConnection(); });35. 数据库连接
35.1 SQL驱动加载
示例代码:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("mydb.sqlite"); if (!db.open()) { qDebug() << db.lastError().text(); }35.2 模型视图
使用QSqlTableModel:
QSqlTableModel* model = new QSqlTableModel; model->setTable("employees"); model->select(); tableView->setModel(model);36. 图形渲染优化
36.1 OpenGL集成
QOpenGLWidget示例:
class GLWidget : public QOpenGLWidget { protected: void initializeGL() override { initializeOpenGLFunctions(); } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT); } };36.2 矢量图形
使用QSvgRenderer:
QSvgRenderer renderer("image.svg"); QPainter painter(this); renderer.render(&painter);37. 音频视频处理
37.1 播放器实现
使用QMediaPlayer:
QMediaPlayer* player = new QMediaPlayer; player->setMedia(QUrl::fromLocalFile("music.mp3")); player->play();37.2 自定义编解码
QAudioFormat配置:
QAudioFormat format; format.setSampleRate(44100); format.setChannelCount(2); format.setSampleSize(16); format.setCodec("audio/pcm");38. 传感器接入
38.1 移动端传感器
使用QSensor:
QSensor sensor("QAccelerometer"); sensor.start(); connect(&sensor, &QSensor::readingChanged, [&]() { qDebug() << sensor.reading()->property("x").toReal(); });38.2 串口设备
QSerialPort配置:
QSerialPort port; port.setPortName("COM3"); port.setBaudRate(QSerialPort::Baud9600); if (port.open(QIODevice::ReadWrite)) { port.write("AT\r\n"); }39. 人工智能集成
39.1 PyQt交互
使用Qt for Python:
from PyQt5.QtWidgets import QApplication app = QApplication([])39.2 模型部署
TensorFlow Lite集成:
QProcess python; python.start("python", {"inference.py", imagePath});40. 工业控制应用
40.1 OPC UA客户端
使用Qt OPC UA模块:
QOpcUaProvider provider; auto client = provider.createClient("open62541"); client->connectToEndpoint("opc.tcp://localhost:4840");40.2 Modbus协议
QModbusTcpClient示例:
QModbusTcpClient* modbus = new QModbusTcpClient; modbus->setConnectionParameter(QModbusDevice::NetworkPortParameter, 502); modbus->connectDevice();41. 金融图表开发
41.1 K线图实现
使用QCustomPlot:
QCPFinancial* candlesticks = new QCPFinancial(plot->xAxis, plot->yAxis); candlesticks->setData(data); plot->rescaleAxes();41.2 实时数据
定时刷新示例:
QTimer* timer = new QTimer(this); connect(timer, &QTimer::timeout, [&]() { updateChart(); }); timer->start(1000);42. 机器学习界面
42.1 训练监控
进度显示实现:
QProgressDialog progress("Training...", "Cancel", 0, 100); connect(trainer, &Trainer::progressChanged, &progress, &QProgressDialog::setValue);42.2 结果可视化
使用Qt Charts:
QChartView* chartView = new QChartView; QLineSeries* series = new QLineSeries; series->append(0, 0); series->append(1, 1); chartView->chart()->addSeries(series);43. 云服务集成
43.1 REST API调用
使用QNetworkRequest:
QNetworkRequest request(QUrl("https://api.example.com/data")); request.setRawHeader("Authorization", "Bearer token"); QNetworkReply* reply = manager->get(request);43.2 WebSocket云通信
示例代码:
QWebSocket socket; socket.open(QUrl("wss://cloud.example.com/ws")); connect(&socket, &QWebSocket::textMessageReceived, [](const QString& msg) { qDebug() << "Received:" << msg; });44. 嵌入式开发
44.1 交叉编译配置
qmake配置示例:
QT_ARCH = arm QMAKE_CC = arm-linux-gnueabihf-gcc QMAKE_CXX = arm-linux-gnueabihf-g++44.2 帧缓冲显示
使用LinuxFB插件:
./myapp -platform linuxfb45. 安全编程实践
45.1 加密解密
使用QCryptographicHash:
QByteArray hash = QCryptographicHash::hash("password", QCryptographicHash::Sha256);45.2 安全存储
QSettings加密示例:
QSettings settings("myapp.ini", QSettings::IniFormat); settings.setValue("password", encryptString(rawPassword));46. 测试驱动开发
46.1 单元测试实践
测试夹具示例:
class TestMath : public QObject { Q_OBJECT private slots: void addTest() { QCOMPARE(Math::add(1,1), 2); } };46.2 模拟对象
使用QSignalSpy:
QSignalSpy spy(button, &QPushButton::clicked); button->click(); QVERIFY(spy.count() == 1);47. 设计模式应用
47.1 信号槽解耦
中介者模式实现:
class Mediator : public QObject { Q_OBJECT signals: void dataChanged(const QString&); public slots: void updateData(const QString& s) { emit dataChanged(s.toUpper()); } };47.2 单例模式
QT实现方式:
class Singleton : public QObject { Q_OBJECT private: explicit Singleton(QObject* parent = nullptr) : QObject(parent) {} public: static Singleton* instance() { static Singleton inst; return &inst; } };48. 代码重构技巧
48.1 信号槽优化
使用lambda简化:
connect(button, &QPushButton::clicked, this, [this]() { statusBar()->showMessage("Button clicked"); });48.2 资源管理
智能指针应用:
QSharedPointer<QFile> file(new QFile("data.txt"));49. 性能调优实战
49.1 渲染优化
双缓冲技术:
void Widget::paintEvent(QPaintEvent*) { QPainter painter(this); painter.drawImage(0, 0, buffer); }49.2 内存管理
对象池实现:
QList<QGraphicsItem*> itemPool; void createPool() { for(int i=0; i<100; ++i) itemPool.append(new QGraphicsRectItem); }50. 项目实战建议
50.1 目录结构规范
推荐布局:
project/ ├── src/ # 源代码 ├── include/ # 头文件 ├── resources/ # 资源文件 ├── tests/ # 单元测试 └── docs/ # 文档50.2 团队协作配置
.gitignore示例:
# Qt build-*/ *.autosave # 生成文件 *.o *.moc51. 插件开发进阶
51.1 元对象系统
使用Q_INTERFACES:
class Plugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) public: void execute() override { /*...*/ } };51.2 动态加载
插件发现机制:
QDir pluginsDir(qApp->applicationDirPath() + "/plugins"); foreach(QString fileName, pluginsDir.entryList(QDir::Files)) { QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); if (auto plugin = qobject_cast<PluginInterface*>(loader.instance())) { plugins.append(plugin); } }52. 多进程架构
52.1 进程间通信
使用QLocalSocket:
// 服务端 QLocalServer server; server.listen("myserver"); // 客户端 QLocalSocket socket; socket.connectToServer("myserver");52.2 共享内存
QSharedMemory示例:
QSharedMemory shared("sharedData"); shared.create(1024); shared.lock(); memcpy(shared.data(), data, size); shared.unlock();53. 国际化最佳实践
53.1 动态翻译切换
实现步骤:
- 准备多语言.qm文件
- 使用QTranslator加载
- 发送LanguageChange事件
53.2 复数处理
使用QT_TRANSLATE_NOOP:
QString msg = tr("%n item(s)", "", itemCount);54. 无障碍支持
54.1 屏幕阅读器
设置可访问属性:
button->setAccessibleName("Submit"); button->setAccessibleDescription("Submit the form data");54.2 高对比度
样式表适配:
QPushButton { border: 2px solid black; }55. 移动端适配
55.1 触摸优化
手势识别:
QGestureRecognizer::registerRecognizer(new SwipeRecognizer); grabGesture(Qt::SwipeGesture);55.2 响应式布局
使用QML States:
State { name: "landscape" when: width > height PropertyChanges { target: panel; width: parent.width/3 } }56. 桌面集成
56.1 系统托盘
QSystemTrayIcon使用:
QSystemTrayIcon* tray = new QSystemTrayIcon(QIcon(":/icon.png")); tray->show();56.2 全局快捷键
使用QHotkey库:
QHotkey* hotkey = new QHotkey(QKeySequence("Ctrl+Alt+D"), true); connect(hotkey, &QHotkey::activated, [](){ /*...*/ });57. 打印支持
57.1 文档打印
QPrinter示例:
QPrinter printer; QPrintDialog dialog(&printer); if (dialog.exec() == QDialog::Accepted) { QPainter painter(&printer); painter.drawText(100, 100, "Hello Qt!"); }57.2 PDF导出
printer.setOutputFormat(QPrinter::PdfFormat); printer.setOutputFileName("output.pdf");58. 3D可视化
58.1 Qt3D基础
实体创建示例:
Qt3DCore::QEntity* entity = new Qt3DCore::QEntity; entity->addComponent(new Qt3DExtras::QCuboidMesh); entity->addComponent(new Qt3DExtras::QPhongMaterial);58.2 模型加载
使用Qt3DRender::QMesh:
Qt3DRender::QMesh* mesh = new Qt3DRender::QMesh; mesh->setSource(QUrl::fromLocalFile("model.obj"));59. 虚拟键盘
59.1 软键盘实现
使用QWidget:
QSignalMapper* mapper = new QSignalMapper(this); for(int i=0; i<10; ++i) { QPushButton* btn = new QPushButton(QString::number(i)); connect(btn, &QPushButton::clicked, mapper, qOverload<>(&QSignalMapper::map)); mapper->setMapping(btn, i); } connect(mapper, &QSignalMapper::mappedInt, this, &MyWidget::keyPressed);59.2 输入法集成
使用QInputMethod:
QInputMethod* im = QGuiApplication::inputMethod(); im->show();60. 项目发布策略
60.1 版本控制
使用QVersionNumber:
QVersionNumber version(1, 0, 2); qDebug() << version.toString(); // "1.0.2"60.2 增量更新
实现方案:
- 生成文件哈希表
- 比较差异文件
- 下载补丁包
- 应用更新
61. 用户反馈系统
61.1 错误报告
使用QCrashHandler:
QCrashHandler::setHandler([](const QString& dumpPath) { QProcess::startDetached("feedback_tool", {dumpPath}); });61.2 自动更新
实现流程:
- 检查版本API
- 下载安装包
- 静默安装
- 重启应用
62. 数据分析集成
62.1 图表生成
使用Qt Charts:
QChart* chart = new QChart; QLineSeries* series = new QLineSeries; series->append(0, 0); series->append(1, 1); chart->addSeries(series); chart->createDefaultAxes();62.2 数据导出
CSV生成示例:
QFile file("data.csv"); if (file.open(QIODevice::WriteOnly)) { QTextStream stream(&file); stream << "Time,Value\n"; for(auto& point : data) { stream << point.time << "," << point.value << "\n"; } }63. 人工智能界面
63.1 模型训练监控
进度显示实现:
QProgressBar* progress = new QProgressBar; connect(trainer, &Trainer::progressChanged, progress, &QProgressBar::setValue);63.2 结果可视化
使用QCustomPlot:
QCPGraph* graph = plot->addGraph(); graph->setData(xValues, yValues); plot->replot();64. 物联网应用
64.1 MQTT客户端
使用QMqttClient:
QMqttClient* client = new QMqttClient; client->setHostname("iot.eclipse.org"); client->connectToHost(); client->subscribe("sensors/temperature");64.2 数据持久化
SQLite存储:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("sensor_data.db"); db.open();65. 游戏开发
65.1 游戏循环
使用QTimer:
QTimer* timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &Game::update); timer->start(16); // ~60FPS65.2 碰撞检测
简单实现:
if (player->rect().intersects(enemy->rect())) { player->takeDamage(); }66. 教育应用
66.1 交互式演示
使用QStateMachine:
QState* s1 = new QState; QState* s2 = new QState; s1->addTransition(button, &QPushButton::clicked, s2);66.2 动画教学
QPropertyAnimation示例:
QPropertyAnimation* anim = new QPropertyAnimation(widget, "geometry"); anim->setDuration(1000); anim->setStartValue(QRect(0,0,100,100)); anim->setEndValue(QRect(100,100,200,200)); anim->start();67. 医疗应用
67.1 数据可视化
ECG曲线绘制:
QCPGraph* ecgGraph = plot->addGraph(); ecgGraph->setData(timePoints, ecgValues);67.2 实时监控
使用QTimer刷新:
QTimer* refreshTimer = new QTimer(this); connect(refreshTimer, &QTimer::timeout, this, &Monitor::updateDisplay); refreshTimer->start(100); // 10Hz68. 金融应用
68.1 实时行情
WebSocket实现:
QWebSocket socket; socket.open(QUrl("wss://quotes.example.com")); connect(&socket, &QWebSocket::textMessageReceived, this, &Trader::processQuote);68.2 交易系统
订单管理:
class Order : public QObject { Q_OBJECT public: enum Status { Pending, Filled, Cancelled }; Q_ENUM(Status) };69. 工业自动化
69.1 PLC通信
使用libmodbus:
modbus_t* ctx = modbus_new_tcp("192.168.1.10", 502); modbus_connect(ctx); uint16_t regs[10]; modbus_read_registers(ctx, 0, 10, regs);69.2 数据采集
定时读取:
QTimer* pollTimer = new QTimer(this); connect(pollTimer, &QTimer::timeout, this, &DAQ::readSensors); pollTimer->start(100);70. 计算机视觉
70.1 OpenCV集成
显示图像:
cv::Mat image = cv::imread("image.jpg"); QImage qimg(image.data, image.cols, image.rows, QImage::Format_RGB888); label->setPixmap(QPixmap::fromImage(qimg));70.2 视频处理
使用QMediaPlayer+OpenCV:
QVideoProbe* probe = new QVideoProbe; connect(probe, &QVideoProbe::videoFrameProbed, [](const QVideoFrame& frame){ frame.map(QAbstractVideoBuffer::ReadOnly); cv::Mat img(frame.height(), frame.width(), CV_8UC3, frame.bits()); frame.unmap(); });71. 增强现实
71.1 摄像头集成
QCamera使用:
QCamera* camera = new QCamera; QCameraViewfinder* viewfinder = new QCameraViewfinder; camera->setViewfinder(viewfinder); camera->start();71.2 标记识别
结合OpenCV:
cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6