«

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 测试是否能正常运行。