写在前面#
最近因为需要,要使用Qt,打开Qt官网一看好家伙已经Qt6了,鉴于用新不用旧 (作死) 的原则,决定整个Qt6。
而网上的教程多为Qt5,虽然大差不差,但仍有区别,踩了不少的坑,故撰写此教程
Qt6#
Qt6是Qt最新推出的版本,相较于Qt5做了一些删减,并增加了新的功能和模块,以适用于未来应用程序的开发。
Qt是一个跨平台的C++图形界面应用程序框架,提供给开发者建立炫酷图形界面的所需的所有功能,能极大的方便c++跨平台GUI程序的开发
目前Qt的最新LTS版本是6.5,可以 只能前往官网下载,因为Qt从从5.15版本开始就不支持离线安装包了,所以只能去官网下载了,Qt5时期流行的清华镜像源虽然也有6.1版本但是qt-everywhere,并没有用过,所以还是推荐官网下载
其实现在可能有国内节点的缘故,安装速度并不慢了。
1.进入官网,点击Try Qt 6
2.在网页的右上角找到 Downloads open source,这是开源的Qt,开源协议为(L)GPL
3.然后拉到最下面找到 Download the Qt Online Installer
1.打开下载好的在线安装器,登陆账号
2.确认同意(L)GPL协议,你也可以把NULL删掉然后勾选个人用户(如果是的话),但是这不重要。
3.下一步,等待一会(不必科学上网),再下一步,此处为询问是否提供信息以改良Qt,这无所谓,随便选一个。
4.选择安装选项,这一步设置安装路径,然后选择Custom installation,当然,也可以直接勾选下面的预设。这里我选择Custom installation.
5.直接勾选Qt目录下的Qt6.5.0,如果不开发安卓应用可以取消选择Android,选择好后下一步。
6.这一步主要是同意证书,同意即可。
7.下一步至开始安装即可,安装过程没必要科学上网,个人下载的速度挺快的,等待安装完成,那么Qt的安装就完成了。
系统环境配置#
Qt文件结构#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| Qt--|-6.5.0 关键的对应平台的模块、库和环境文件,还有各自的Qtdesigner
--|-Src
|-mingw111_64 通用的环境
|-msvc2022_64 针对msvc的环境
|-android_arm64_v8a
|-android_armwv7
|-android_x86
|-android_x86_64
|-sha1.txt
|-dist
|-Docs 帮助手册
|-Examples 样例
|-installerResources 安装资源
|-Lienses 证书
|-Tools Qt所使用的工具,包括编译器、Cmake以及QtCreator等
|-vcredist
|-MaintenanceTools.exe 模块管理工具
|-...其他一些琐碎的文件
|
系统变量设置#
其实可以不用设置,如果不用命令行,只用可视化界面来使用Qt的话。但是考虑到刚出炉没打包依赖库程序的运行应当设置环境。
如果你使用mingw,那么应该在系统的用户环境变量中的Path中,添加如下2行,注意顺序
其次,可以注意到这里我自己装有mingw64,所以为了不污染Qt的库,我将Qt的路径上移到了mingw64的上方,这很重要,后续出现的很多问题都是环境变量配置不当引起的.
设置完环境变量,Qt环境算是完全配置完成了
如果你使用msvc的话,只要将Qt文件里msvc对应的路径添加进path即可。
至此你已经可以用QtCreator来编写Qt应用程序了,可是Clion这么好用,为什么不用Clion呢。
Clion+Qt相关配置#
Clion的下载和安装#
自行解决。
添加工具链(可选)#
此版本Qt使用的编译器mingw111_64,以及msvc2022_64等,如果你的Clion中已经有对应版本的自己安装的工具链,可以不增加Qt提供的工具链,关键的是之后的CMakeLists.txt的配置。
但是,还是推荐使用Qt提供的工具链,以免发生不要的错误~~(诶~就是玩)~~。
此处使用mingw为例,若无特殊说明,此后均以mingw为例,msvc与此大同小异。
1.打开Clion设置找到工具链(Toolchains),按"+“号,添加一个MinGW的工具链,如图
名称(Name)随意,环境(Environment)填写,Qt目录下Tools里对应的文件夹,如这里是Qt\Tools\mingw1110_64,
Tools里并没有msvc的编译器,如果想在Clion里用msvc构建Qt项目,请安装VS2022,然后在Clion中添加msvc的工具链
创建Qt工程#
Clion自某一版本后原生支持创建Qt工程,在新建项目中选择即可。
这里有2个选项分别对应的是Qt的控制台应用(类似于是无GUI的命令行)和微件应用(GUI图形界面)
选择微件应用,设置好相应的属性,创建即可。
这里的Qt CMake前缀路径不用设置,因为这样生成的CMakeLists.txt是针对Linux平台的,对于Win10系统这个CMakeLists文件大有问题。后期需要修改。
CMakeLists.txt的配置#
其实Clion的项目主要靠的就是CMakeLists.txt,只要这个配置对了,创建项目时的选择并不重要,所以其实上一步某种意义上作用不大。
这里给出我的CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
| cmake_minimum_required(VERSION 3.5)
#设置项目名称,如此处为MapFind
project(MapFind VERSION 0.1 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#打开自动UIC MOC RCC
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
#设置C++标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#设置CMake前缀路径
set(CMAKE_PREFIX_PATH "D:/Packages/Qt/6.5.0/mingw111_64/lib/cmake") #这很重要,直接关系到能否构建,如这里是设置到Qt/6.5.0/mingw111_64/lib/cmake
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check https://doc.qt.io/qt/deployment-android.html for more information.
# They need to be set before the find_package( ...) calls below.
#if(ANDROID)
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
# if (ANDROID_ABI STREQUAL "armeabi-v7a")
# set(ANDROID_EXTRA_LIBS
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
# endif()
#endif()
find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
set(PROJECT_SOURCES
main.cpp
MapMainwindow.cpp MapMainwindow.h mapmainwindow.ui MapItem.cpp MapItem.h)
if (${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(${PROJECT_NAME}
MANUAL_FINALIZATION
${PROJECT_SOURCES}
)
else ()
if (ANDROID)
add_library(${PROJECT_NAME} SHARED
${PROJECT_SOURCES}
)
else ()
add_executable(${PROJECT_NAME}
${PROJECT_SOURCES}
)
endif ()
endif ()
target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
set_target_properties(${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)
if (QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(${PROJECT_NAME})
endif ()
#区别debug和release,以便去除命令行
if (${CMAKE_CXX_COMPILER} MATCHES ".*/(g\\+\\+)(\\..*)")
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE "-mwindows") #设置去除命令行
elseif (${CMAKE_CXX_COMPILER} MATCHES ".*/(cl)(\\..*)")
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
endif ()
|
其实可以使用QtCreaor来创建项目,只需要在创建项目是选择构建器为cmake,而不是qmake,然后使用Clion打开也可,此CMakeLists.txt也是根据QtCreator生成的文件修改而来。
2.为了方便以后的项目创建我们还可以把这个制作为Clion的文件模板。如何添加模板可自行解决。
这里给出模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
| cmake_minimum_required(VERSION 3.5)
#自动设置项目名称
project(${PROJECT_NAME} VERSION 0.1 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#打开相应的UIC MOC RCC
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
#设置c++标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#设置CMake前缀路径
set(CMAKE_PREFIX_PATH "D:/Packages/Qt/6.5.0/mingw111_64/lib/cmake")
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check https://doc.qt.io/qt/deployment-android.html for more information.
# They need to be set before the find_package( ...) calls below.
#[[#if]]#(ANDROID)
# set(ANDROID_PACKAGE_SOURCE_DIR "#[[${CMAKE_CURRENT_SOURCE_DIR}]]#/android")
# if (ANDROID_ABI STREQUAL "armeabi-v7a")
# set(ANDROID_EXTRA_LIBS
# #[[${CMAKE_CURRENT_SOURCE_DIR}]]#/path/to/libcrypto.so
# #[[${CMAKE_CURRENT_SOURCE_DIR}]]#/path/to/libssl.so)
# endif()
#[[#endif]]#()
find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt#[[${QT_VERSION_MAJOR}]]# COMPONENTS Widgets REQUIRED)
set(PROJECT_SOURCES
main.cpp
)
if(#[[${QT_VERSION_MAJOR}]]# GREATER_EQUAL 6)
qt_add_executable(#[[${PROJECT_NAME}]]#
MANUAL_FINALIZATION
#[[${PROJECT_SOURCES}]]#
)
else()
if(ANDROID)
add_library(#[[${PROJECT_NAME}]]# SHARED
#[[${PROJECT_SOURCES}]]#
)
else()
add_executable(#[[${PROJECT_NAME}]]#
#[[${PROJECT_SOURCES}]]#
)
endif()
endif()
target_link_libraries(#[[${PROJECT_NAME}]]# PRIVATE Qt#[[${QT_VERSION_MAJOR}]]#::Widgets)
set_target_properties(#[[${PROJECT_NAME}]]# PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION #[[${PROJECT_VERSION}]]#
MACOSX_BUNDLE_SHORT_VERSION_STRING #[[${PROJECT_VERSION_MAJOR}]]#.#[[${PROJECT_VERSION_MINOR}]]#
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(#[[${PROJECT_NAME}]]#)
endif()
# 区别debug和release来决定是否去除命令行
if(#[[${CMAKE_CXX_COMPILER}]]# MATCHES ".*/(g\\+\\+)(\\..*)")
set_target_properties(#[[${PROJECT_NAME}]]# PROPERTIES LINK_FLAGS_RELEASE "-mwindows")
elseif(#[[${CMAKE_CXX_COMPILER}]]# MATCHES ".*/(cl)(\\..*)")
set_target_properties(#[[${PROJECT_NAME}]]# PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
endif()
|
QtDesigner#
虽然Clion中不能和在QtCreator上一样直接可视化编辑图形界面文件(ui)文件,但是我们可以通过Clion中的外部工具来实现一键打开调用QtDesigner来实现
在 “文件”->“设置”->“工具”->“外部工具(External Tools)” 中添加一个工具,如图
在这里"程序"一栏填写的是我电脑上Qt的MinGW平台下的designer。Qt每个不同的平台都有一个各自的designer,所以要选择对应的平台。
至此Clion和Qt的联合配置完成了,已经可以开始愉快的在Clion中编写Qt程序了,以及新建Qt项目了。
总的来说,Clion上项目的管理主要依靠的是CMakeLists.txt文件,只要抓住这个文件,总能解决一些问题
常见问题及错误#
运行相关#
1.Clion中程序无法直接小箭头运行,错误代码-1073741511(0xC0000139)
出现这个原因是因为编译出的Qt程序没办法,链接到对应的动态库导致的,目前主要有2种解决办法
第一种:
修改系统变量,确保在上述过程中系统变量设置正确,而且前面的路径没有存在Qt库污染环境。注意查看系统的path里有没有,之前有遇到装了matlab在系统的path里写了变量导致无法链接的。
修改完后重启Clion,乃至系统。
第二种(推荐且肯定有效):
配置Clion"运行/调试配置"的工作目录,往其中填入对应平台的bin文件夹的路径,即可。
2.直接双击运行编译出的exe文件失败
这个问题同上个问题差不多,就是动态链接库链接失败,可以使用windeployqt工具来将对应的库复制到同目录下解决。如果系统环境被污染了,那就爆炸了,一定一定要正确的系统环境,或者在使用windeployqt前设置命令行的临时环境变量。详情可以查看别的文章
编译相关#
1.找不到对应包/代码提示与检查无法识别相关类
大概率是CMakeLists.txt中的前缀路径设置错误,若检查无错,同时使用了例如socket等功能,则是没有在CMakeLists.txt中包含对应的包。可以去Qt官网查找手册,会给出cmake如何加入相关的包.
此处给出添加network包的示例:
1
2
3
| find_package(Qt6 COMPONENTS Network REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Network)
|
2.编译无法识别自建类
请在cmke文件中的set(PROJECT_SOURCES main.cpp)中手动添加自建类的相关文件(包括.ui文件),这个错误主要是因为在文件创建后替换了cmake文件导致IDE无法将已经创建的文件自动加入其中
发布相关#
1.使用windeployqt后仍无法运行
这个问题是因为系统环境中有路径内有Qt库污染导致的,强烈建议使用Qt安装后提供的对应平台环境的终端来运行windeployqt,如“Qt 6.5.0 (MinGW 11.1.0 64-bit)”
2.无法找到其他教程所说的终端窗口
如果你是在线安装的,可以试试windows自带的搜索工具
也可以使用终端(如cmd)运行Qt对应平台环境的bin目录下的qtenv2.bat.
3.运行qtenv2.bat无法打开指定路径
该错误一般出现在离线拷贝的Qt6环境,因为qtenv2.bat本质上只是帮你实现了指定临时环境的操作,而其内部是简单的绝对路径设置,在安装时写死了,所以你应该编辑修改qtenv2.bat里的相关路径
其他问题#
1.更新Qt后CMake报错
要解决这个问题首先需要更新CMakeLists.txt中的prefix(前缀路径)为最新的Qt对应的路径,其次应该清理项目中的Cmake缓存文件(不只有构建文件)。然后重新载入Cmake项目。
Qt6的安装过程以及和Clion的联合配置,其过程需要对环境的配置以及Clion对于项目的管理以及其他功能有一定的研究,对于cmake需要有一定的了解。同时解决一些发生的错误的过程,需要对Qt的文件结构,以及一些入口有一定的了解。
但是总的来说,虽然是摸着Qt5的教程配置Qt6的过程中还是遇到了许多困难,但是还是最终解决了,同时相关的能力,以及对于系统环境的认识更加的深刻了。