CLion配置Qt开发环境

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打包自己的程序,然后查看打包目录下生成的文件夹及动态库文件,然后可使用以下两种办法解决。

  1. 将自己的程序使用到的动态库和目录全部复制到bulid目录下,保证bulid目录和打包结果目录一样。这种方法简单粗暴,当build目录被删除后需要重新复制。
  2. 在CMakeLists.txt中将动态库文件和目录生成。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值