Qt的使用技巧
时间:2025-3-31 15:35 作者:六度科技 分类: C
定时器时钟用法
#include <QTimer>
// 构造函数:初始化主窗口
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
// 创建实时刷新 UI tableWidget表格的定时器
QTimer* updateTimer = new QTimer(this);
connect(updateTimer, &QTimer::timeout, this, [this, updateTimer]() {
if (working) {
ui->tableWidget->viewport()->update();
}
});
updateTimer->start(100); // 每100毫秒更新一次
}
线程安全更新表格-防闪退
#include <QApplication>
// 确保线程安全地更新表格状态
void MainWindow::updateTableStatus(int row, const QString& status)
{
// 在主线程中安全更新UI
if (QThread::currentThread() == QApplication::instance()->thread()) {
// 已经在主线程中,直接更新
if (row >= 0 && row < ui->tableWidget->rowCount() &&
ui->tableWidget->item(row, 5) != nullptr) {
ui->tableWidget->item(row, 5)->setText(status);
}
} else {
// 在工作线程中,使用信号-槽机制安全地更新UI
emit needUpdateStatus(row, status);
}
}
// MainWindow构造函数中连接信号和槽
connect(this, &MainWindow::needUpdateStatus, this, [this](int row, const QString& status) {
if (row >= 0 && row < ui->tableWidget->rowCount() &&
ui->tableWidget->item(row, 5) != nullptr) {
ui->tableWidget->item(row, 5)->setText(status);
// 更新完刷新
ui->tableWidget->viewport()->update();
}
}, Qt::QueuedConnection);
// 在设置这一行时一定要先写为空
ui->tableWidget->setItem(row, 5, new QTableWidgetItem(""));
// 线程中调用
MainWindow::getInstance()->updateTableStatus(0, "[通过]");
调试输出代码
#include <iostream>
std::cout << "来自 " + sender.address().to_string() + " 的回复: 字节=32 时间=" + format_ms(ms) << std::endl;
std::cout.flush(); // 确保立即输出 可能会乱码输出
添加资源文件 版本文件 权限文件
Qtnetest.pro文件中添加.rc引用
RC_FILE = version.rc
新建version.rc文件
#pragma code_page(65001) // UTF-8 编码
#include <windows.h>
//引入权限文件
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "app.manifest"
//图标
IDI_ICON1 ICON DISCARDABLE "images/net.ico"
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,0,0,1 // 文件版本(逗号分隔,对应0.0.0.0)
PRODUCTVERSION 0,0,0,1 // 产品版本
FILEFLAGSMASK 0x3fL
FILEFLAGS 0x0L
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0" // 语言和编码(英语-美国,UTF-16)
BEGIN
VALUE "FileDescription", "Qtnetest Application" // 文件说明
VALUE "FileVersion", "0.0.0.1" // 文件版本(字符串格式)
VALUE "ProductName", "六度网络测试工具" // 产品名称
VALUE "ProductVersion", "0.0.0.1" // 产品版本(字符串格式)
VALUE "LegalCopyright", "版权所有 © 2025 六度科技" // 版权信息
VALUE "OriginalFilename", "六度网络测试工具.exe" // 原始文件名
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0804, 1200 // 语言ID(中文-中国)
END
END
标准打包(生成包含所有依赖文件的文件夹)
使用 windeployqt 自动收集依赖
这是Qt官方工具,可自动复制所需的DLL和插件到目标目录。
步骤:
编译为Release模式
在Qt Creator中,选择 Release 模式,点击 构建 → 重新构建项目。
生成的可执行文件路径通常为:
build-release\YourApp.exe
打开Qt命令行工具
从开始菜单找到对应Qt版本的命令行工具(如:Qt 5.15.2 (MinGW 8.1.0 64-bit))。
切换到可执行文件所在目录:
cd C:\YourProject\build-release
运行 windeployqt
windeployqt YourApp.exe
此命令会自动复制以下内容到当前目录:
Qt核心库(如 Qt5Core.dll, Qt5Gui.dll)。
平台插件(platforms\qwindows.dll)。
图像格式插件(imageformats\qjpeg.dll)。
其他依赖项(如OpenGL、ICU库等)。
验证打包目录
检查目录中是否包含以下关键内容:
YourApp.exe
Qt5*.dll(多个Qt库文件)
platforms\ 文件夹
imageformats\ 文件夹
双击 YourApp.exe 测试是否能正常运行。