Windows下Clion配置Qt开发环境
配置CMAKE和ToolChain
新建项目,Qt Widgets Executable,配置CMake prefix path,本人环境如下所示。
配置ToolChain,Settings。
将Qt的MinGW置顶,表示使用Qt的MinGW编译
运行程序测试。
配置.ui文件
默认情况下,CMakeLists.txt中,配置了自动处理ui文件和qrc文件。
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
新建文件,Qt UI Class
此时项目目录如下所示
运行程序,uic程序会解析ui文件,生成ui_widget.h文件,红色波浪线消失。
在windows中配置.ui文件的默认应用程序为Qt安装目录下Tools下的Qt Designer,在Clion中双击.ui文件,会自动打开Qt Designer,添加一个按钮后保存,修改main函数代码,测试效果。(ui文件变化后需要重新build)。
配置.qrc文件
新建文件res.qrc,并在CMakeLists.txt中添加。
add_executable(clion_demo main.cpp
widget.cpp
widget.h
widget.ui
res.qrc)
默认情况下Clion以xml文件方式打开qrc文件,其实qrc文件的编辑比较简单,以xml方式手动编译亦无不可。当然也可以配置Clion以Windows默认应用程序打开qrc文件,然后设置qrc文件以Qt Creator打开即可,关于如何修改JetBrains工具的文件打开方式。
默认情况下,qrc文件内容为空,qtcreator读取时会报错,新的qrc文件应有一对空的RCC标签,在File and Code Templates中添加qrc文件的模板。如下图所示。
编辑完res.qrc并保存,打开Qt Designer,添加资源文件,选择当前目录下的res.qrc,修改按钮图标。
保存后重新运行程序。
解决组件样式古老问题
使用Clion跑出来的界面和Qt Creator中不一样,前者还是老式风格,原因在于CLion没有添加qwindowsvistastyle.dll文件,在CMakeLists.txt中加入即可。
if (EXISTS "${QT_INSTALL_PATH}/plugins/styles/qwindowsvistastyle${DEBUG_SUFFIX}.dll")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/styles/")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${QT_INSTALL_PATH}/plugins/styles/qwindowsvistastyle${DEBUG_SUFFIX}.dll"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/styles/")
endif ()
解决图片无法显示问题
开发过程中发现同样的代码ico图标在qtcreator中正常显示,Clion中无法显示,编译过程显示UIC、RCC均正常,最后发现是缺少了处理图片的动态库,如下所示。
cmake中将以上动态库全部复制过来即可。
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/imageformats/")
# qgif qico qjpeg qsvg
FILE(GLOB IMAGE_DLLS "${QT_INSTALL_PATH}/plugins/imageformats/*${DEBUG_SUFFIX}.dll")
foreach (IMAGE_DLL ${IMAGE_DLLS})
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${IMAGE_DLL}"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/imageformats/")
endforeach (IMAGE_DLL)
CMakeLists.txt一次配置,永久生效
避免每个项目都要额外手动添加两段CMake代码,可以在File and Code Templates中直接修改模板。
打包发布
添加Release编译选项。
运行Release,出现cmake-build-release文件夹及下面一堆文件,总大小相比于Debug小挺多。
使用windeployqt打包
可以将release的exe可执行程序复制到一个新的准备发布的文件夹,以sample4_12.exe为例。
在Qt安装路径下的mingw或者msvc的bin目录下找到windeploy.exe,一行命令直接打包。
D:\prog\Qt\6.5.3\mingw_64\bin\windeployqt.exe C:\Users\chunf\Desktop\sample4_12\sample4_12.exe
打包会复制许多的dll文件到目录下,体积较大,可以尝试删除不需要的dll文件,挨个删除挨个运行程序,运行失败再撤销删除即可。
去除黑窗口
Release打包后发现执行exe出现黑窗口,原因是没有在cmake文件中的add_executable加入WIN32。在Clion Qt CMakeLists模板中添加如下内容,表示WINDOWS环境下且编译类型不是Debug时,加入WIN32去掉控制台窗口。
if (NOT CMAKE_BUILD_TYPE MATCHES "Debug")
set(CMAKE_WIN32_EXECUTABLE ON)
endif ()
本次demo完整的CMakeLists.txt模板
cmake_minimum_required(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
project(${PROJECT_NAME})
set(CMAKE_CXX_STANDARD ${CMAKE_LANGUAGE_VERSION})
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
#if( ${CMAKE_MAJOR_VERSION} < 3 || ( ${CMAKE_MAJOR_VERSION} == 3 and ${CMAKE_MINOR_VERSION} < 7 ) )
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#end
#if( ${QT_PATH} != "" )
set(CMAKE_PREFIX_PATH "${QT_PATH}")
#end
find_package(Qt${QT_VERSION} COMPONENTS
#foreach( $library in ${REQUIRED_LIBS} )
$library
#end
REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
#if(${WINDOWS})
if (NOT CMAKE_BUILD_TYPE MATCHES "Debug")
set(CMAKE_WIN32_EXECUTABLE ON)
endif ()
#end
target_link_libraries(${PROJECT_NAME}
#foreach( $library in ${REQUIRED_LIBS} )
Qt#if( ${QT_VERSION} < 6 )${QT_VERSION}#end::$library
#end
)
#if( ${WINDOWS} )
#set( $d = "$" )
if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
set(DEBUG_SUFFIX)
if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
set(DEBUG_SUFFIX "d")
endif()
set(QT_INSTALL_PATH "${d}{CMAKE_PREFIX_PATH}")
if(NOT EXISTS "${d}{QT_INSTALL_PATH}/bin")
set(QT_INSTALL_PATH "${d}{QT_INSTALL_PATH}/..")
if(NOT EXISTS "${d}{QT_INSTALL_PATH}/bin")
set(QT_INSTALL_PATH "${d}{QT_INSTALL_PATH}/..")
endif()
endif()
if(EXISTS "${d}{QT_INSTALL_PATH}/plugins/platforms/qwindows${d}{DEBUG_SUFFIX}.dll")
add_custom_command(TARGET ${d}{PROJECT_NAME} POST_BUILD
COMMAND ${d}{CMAKE_COMMAND} -E make_directory
"${d}<TARGET_FILE_DIR:${d}{PROJECT_NAME}>/plugins/platforms/")
add_custom_command(TARGET ${d}{PROJECT_NAME} POST_BUILD
COMMAND ${d}{CMAKE_COMMAND} -E copy
"${d}{QT_INSTALL_PATH}/plugins/platforms/qwindows${d}{DEBUG_SUFFIX}.dll"
"${d}<TARGET_FILE_DIR:${d}{PROJECT_NAME}>/plugins/platforms/")
endif()
foreach(QT_LIB #foreach( $library in ${REQUIRED_LIBS} )$library #end)
add_custom_command(TARGET ${d}{PROJECT_NAME} POST_BUILD
COMMAND ${d}{CMAKE_COMMAND} -E copy
"${d}{QT_INSTALL_PATH}/bin/Qt${QT_VERSION}${d}{QT_LIB}${d}{DEBUG_SUFFIX}.dll"
"${d}<TARGET_FILE_DIR:${d}{PROJECT_NAME}>")
endforeach(QT_LIB)
endif()
if (EXISTS "${QT_INSTALL_PATH}/plugins/styles/qwindowsvistastyle${DEBUG_SUFFIX}.dll")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/styles/")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${QT_INSTALL_PATH}/plugins/styles/qwindowsvistastyle${DEBUG_SUFFIX}.dll"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/styles/")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/imageformats/")
# qgif qico qjpeg qsvg
FILE(GLOB IMAGE_DLLS "${QT_INSTALL_PATH}/plugins/imageformats/*${DEBUG_SUFFIX}.dll")
foreach (IMAGE_DLL ${IMAGE_DLLS})
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${IMAGE_DLL}"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/imageformats/")
endforeach (IMAGE_DLL)
endif ()
#end
解决开发阶段缺少动态库的方法
如果确定自己的代码没有问题,但是在Clion中运行又达不到想要的效果时,可以尝试使用windeployqt打包自己的程序,然后查看打包目录下生成的文件夹及动态库文件,然后可使用以下两种办法解决。
- 将自己的程序使用到的动态库和目录全部复制到bulid目录下,保证bulid目录和打包结果目录一样。这种方法简单粗暴,当build目录被删除后需要重新复制。
- 在CMakeLists.txt中将动态库文件和目录生成。