Qt 快速上手·一日通(基于CLion)

离线版本无法下载:https://download.qt.io/archive/qt/5.12/5.12.12/qt-opensource-windows-x86-5.12.12.exe

一、Qt 在线版本下载安装

QT现在只能在线下载器安装。下载器的下载地址:

https://download.qt.io/archive/online_installers/

据需要下载在线安装包:qt-unified-windows-x64-4.7.0-online.exe 或者 qt-online-installer-windows-x64-4.8.0.exe

 安装需要的 MSVC或MinGW 版本就好,当然也可以两个版本都安装:MSVC 2019 64-bitMinGW 11.2.0 64-bit,分别给 Microsoft Visual C++MinGW 编译器使用。如下图:

 Qt 库路径 和 编译工具链路径,添加到系统变量 path 中, 只需添加红色方框内的即可

插件路径,添加到系统变量:QT_PLUGIN_PATH

   

二、CLion 创建QT工程(Qt 微件可执行文件)

2.1  创建 Qt Widgets Executable 项目

假设QT安装目录为:D:\Qt    ,QT版本号6.6.3编译器选择的是MinGW 64-bit,那么QT CMake 前缀路径D:/Qt/6.6.3/mingw_64

上图Clion的 配置,与下图生成的 CMakeList.txt 文件中的 变量 关系。注意,QT6必须C++17以上的标准。

 
QT 微件可执行文件-配置 CMakeLists.txt -变量
位置(L):E:\workForClion\Qt

# ${PROJECT_SOURCE_DIR}/

project(Qt)   # ${PROJECT_NAME}

语言标准:C++ 17 set(CMAKE_CXX_STANDARD 17)
Qt CMake 前缀路径:D:\Qt\6.6.3\mingw_64 set(CMAKE_PREFIX_PATH "D:/Qt/6.6.3/mingw_64")
Qt 版本:6 find_package(Qt6

 

2.2 设置 CLion 工具链

在设置 -> 构建、执行、部署 -> 工具链,选项中创建 "MinGW-QT" 工具链。配置 “工具集” 和 "CMake"

 

2.3 配置QT专用“外部工具”

添加以下三个QT常用工具:Qt DesignerUIC、RCC 、MOC 和 Qt语言家( linguist ) 

手动“编辑”型工具:Qt Designer 的功能是 编辑 .ui 文件;UIC的功能是 编译 .ui 文件生成 ui_xxx.h;Qt语言家( linguist ) 编辑 xxx_zh_CN.ts, 实现国际多语言支持。

自动“编译”型工具:MOC的功能是 编译 包含宏 Q_OBJECT的 xxx.h 文件生成 moc_xxx.cpp 文件;RCC的功能,编译 xxx.qrc 资源文件,生成 qrc_xxx.cpp 文件,供 exe 使用。

# CMakeLists.txt 文件中,配置打开 MOC RCC UIC,自动工具
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

用户界面编译器(UIC)、元对象编译器(MOC)和资源编译器(RCC)

UIC针对Qt Designer工具生成的XML格式的用户界面设计文件(扩展名为.ui)进行处理,转换为相应的C++代码。
MOC是Qt独有的一个工具,主要作用是扩展C++的功能,使之支持信号和槽机制(这是Qt事件通信的核心)
RCC是读取资源文件(.qrc),处理应用程序中静态资源(如图片、音频文件、翻译文件等)的工具。它允许开发者将这些资源以二进制形式嵌入到应用程序的可执行文件中。

下图为 Qt Designer 工具配置:

程序:     D:\Qt\6.6.3\mingw_64\bin\designer.exe
实参:    $FileName$
工作目录: $FileDir$

 

下图为 UIC 工具配置:

程序:    D:\Qt\6.6.3\mingw_64\bin\uic.exe
实参:    $FileName$ -o ui_$FileNameWithoutExtension$.h
工作目录:$FileDir$

下图为 RCC 工具配置:

程序:D:\Qt\6.6.3\mingw_64\bin\rcc.exe
实参:  --binary $FileName$ -o $FileNameWithoutExtension$.rcc
工作目录: $FileDir$

  下图为 MOC 工具配置:

程序:    D:\Qt\6.6.3\mingw_64\bin\moc.exe
实参:    $FileName$ -o moc_$FileNameWithoutExtension$.cpp
工作目录:$FileDir$

下图为 Qt语言家(linguist) 工具配置:

程序:    D:\Qt\6.6.3\mingw81_64\bin\linguist.exe
实参:    $FileName$
工作目录: $FileDir$

 

 

三、创建、编辑 QT 的 UI 界面

3.1 CLion 创建主窗口(Qt UI::QMainWindow)

下图创建类型为 QMainWindow 的“Qt UI类”作为主启动界面

 新建一个“Qt UI类”生成以下三个文件:

mainwindow.ui
mainwindow.h
mainwindow.cpp

 

3.2 Qt Designer 编辑主窗口.ui文件(mainwindow.ui)

 右键菜单 mainwindow.ui  文件,选择:外部工具 -> QtDesigner,  打开 “Qt 设计师” 软件

 Qt 设计师,编辑完保存,Clion 重新编译。

3.3 UIC 编译主窗口.ui文件(mainwindow.ui)生成c++文件(ui_mainwindow.h)

 

3.4 RCC 编译资源.qrc文件(res.qrc)生成c++文件(qrc_res.cpp)

 这步为 Clion 自动完成,前提是如下CMakeLists.txt 中,目标依赖源文件包含这个资源文件: ${PROJECT_SOURCE_DIR}/resources/res.qrc

4 CLion编译运行程序

 工程中的变化-1:CMakeLists.txt

# 添加源文件
add_executable(${PROJECT_NAME} src/main.cpp
resources/res.qrc
forms/mainwindow.ui
include/mainwindow.h
src/mainwindow.cpp)

工程中的变化-2:main.cpp

#if 0
int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    QPushButton button("Hello world!", nullptr);
    button.resize(200, 100);
    button.show();
    return QApplication::exec();
}
#else
#include "mainwindow.h"
int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    MainWindow mw;
    mw.show();
    return QApplication::exec();
}
#endif

 

附件A:Qt 工程引用第三方库的三种方式

详见:https://www.cnblogs.com/suntroop/articles/18619111

方式一:“库名”直接引用方式
方式二:find_library 寻库方式
方式三:find_package 寻包方式

附录B:  QT国际化多语言

详见:https://www.cnblogs.com/apocelipes/p/14355460.html

在Qt中,调用 “Qt语言家 Linguist” 来从源代码生成 .ts 翻译文件,生成 .qm 文件。

QM文件是Qt翻译后的文件,它包含了所有已翻译的文本字符串。通过生成QM文件,我们可以轻松地在Qt应用程序中实现多语言支持。

1. CMakeLists.txt 构建配置

第一种办法:我们可以使用 qt5_create_translation 命令,

# 查找Qt Linguist工具
find_package(Qt5 LinguistTools REQUIRED)

# 指定生成 QM 目标文件的输入TS文件名
set(TS_FILES
        ${CMAKE_SOURCE_DIR}/zh_CN.ts
        ${CMAKE_SOURCE_DIR}/en_US.ts
        ${CMAKE_SOURCE_DIR}/ja_JP.ts)  

# 生成 TS 和 QM 目标文件

# 函数原型:qt5_create_translation(<VAR> ts-file-or-sources [ts-file-or-sources2 ...] [OPTIONS ...])
# 注册国际化ts文件及其依赖源,输出qm文件列表; 生成的 qm 文件路径保存在<VAR>中。 函数原型定义在这个文件中:Qt5LinguistToolsMacros.cmake
#qt5_create_translation(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES} OPTIONS -source-language en_US -no-obsolete)
#qt5_create_translation(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES} OPTIONS -source-language zh_CN -no-obsolete)

qt5_create_translation(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES})

# 将QM文件复制到输出路径
file(COPY {QM_FILES} DESTINATION {QM_OUTPUT_DIR})

add_executable(<Tgt> main.cpp ${QM_FILES} ${TS_FILES}) 

# MESSAGE(STATUS "=== QM_FILES        = ${QM_FILES}")

在上面的CMakeLists.txt中, 我们首先使用find_package命令来查找Qt的Linguist工具包。
然后,我们定义了TS_FILES 变量,它保存了我们的翻译文件的路径。
我们还定义了 QM_OUTPUT_DIR 变量,它保存了生成的QM文件的输出路径

接下来,我们使用 qt5_create_translation 命令来运行 lupdate 生成 .ts文件;运行 lrelease 并生成 .qm 文件
该命令接受三个参数:QM_FILES变量源代码目录的路径,以及翻译文件的路径
这将告诉cmake去哪里查找源代码和翻译文件,并生成相应的QM文件。
最后,我们使用file命令将QM文件复制到输出路径,以便我们可以在构建过程中访问它们。

注意,必须将 <VAR> 加入到 add_executable 参数中才能在编译时生成只有原文的 .ts 文件

ts 文件会在“清除”或重新编译的时候一并被删除,再编译的时候生成全新的 .ts(原有的翻译会丢失,万分注意!!)

第二种办法:使用手动调用 lreleaselupdate 实用程序

MESSAGE(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")

set(TS_DIR   "${CMAKE_SOURCE_DIR}/translations")
set(TS_FILES "${TS_DIR}/${PROJECT_NAME}_zh_CN.ts"
#        "${TS_DIR}/${PROJECT_NAME}_ru_RU.ts"
#        "${TS_DIR}/${PROJECT_NAME}_en_US.ts"
#        "${TS_DIR}/${PROJECT_NAME}_ja_JP.ts"
)
# lupdate  工具用于从源代码中提取翻译字符串并生成 .ts 文件。这个文件包含应用程序中的所有待翻译字符串。
find_program(LUPDATE_EXECUTABLE lupdate)
# lrelease 工具用于将 .ts 文件编译成二进制格式的 .qm 文件,供 Qt 应用程序使用
find_program(LRELEASE_EXECUTABLE lrelease)

foreach(_ts_file ${TS_FILES})
    # lupdate <source_files> -ts <output_file.ts>
    execute_process( COMMAND ${LUPDATE_EXECUTABLE} -excludepaths "vcpkg/*" -recursive ${CMAKE_SOURCE_DIR} -ts ${_ts_file})
    # lrelease <ts_file>
    execute_process( COMMAND ${LRELEASE_EXECUTABLE} ${_ts_file})
endforeach()

 

 

实践发现第二种方法更灵活。

 2. 源代码修改

#include <QLocale>
#include <QTranslator>
 
int main()
{
    QObject::tr("clicked left button")                   // QObject::tr("<带翻译文字>")

    QApplication a(argc, argv);
    QTranslator trans;
    -if (trans.load("./" + QLocale().name() + ".qm")) {  // QLocale::system().name()
    +if (trans.load(":/" + QLocale().name() + ".qm")) {  // 注意 .变成了:,这代表我们指定的路径是使用.qrc中嵌入资源的。
        QCoreApplication::installTranslator(&trans);
    }
    ...
    return a.exec();
}

 

 

 

 








 

posted @ 2024-12-13 10:47  suntroop  阅读(1041)  评论(0)    收藏  举报