您现在的位置是:首页 > 正文

Qt - Clion使用cmake运行QtCreator创建的qmake项目,无改动切换自如

2024-01-30 22:46:28阅读 0

Clion使用cmake运行QtCreator创建的qmake项目,这也正是我希望的。既可用QtCreator运行qt的qmake项目进行debug、发布等,同时也可以享受clion编码、debug的便捷高效(对于jetbrains idea用户来说)。因为用qtcreaotr编写代码实在是不流畅、难用、编码提示慢而少。

建议用Clion2021.1.*以上的版本(便捷使用qt项目,详细原因不解释)

总体实现目标,两全其美:

  • qt的qmake项目在qtcreator、clion上的运行调试(无改动切换)
  • 使用qtcreator负责创建、发布项目
  • 使用clion编码、debug

在qtcreator中创建qmake项目

1.创建

在这里插入图片描述

2.选择qmake

在这里插入图片描述
默认即可
在这里插入图片描述
继续
在这里插入图片描述

完成创建,如下:
在这里插入图片描述

Clion配置
建议用Clion2021.1.*以上的版本(便捷使用qt项目,详细原因不解释)

接下来,打开clion,前提是已经配置好qt中的mingw、cmake(很简单),参考我的clion配置文章this
附上配图吧
toolchains
在这里插入图片描述
cmake
在这里插入图片描述
其实在clion中添加好qt的mingw,其他都会自动识别出来

4.用clion打开刚刚qtcreator创建的项目工程

会提示
在这里插入图片描述
点ok
在这里插入图片描述

其实会自动创建CMakeList.txt

在main.cpp同级目录下(最好是同级)自己手动添加cmake工程构建文件,文件名称:CMakeList.txt
在这里插入图片描述

5.CMakeList.txt文件内容(两种)

内容参考两种,两种都可以运行,只要配置正确

第一种clion生成

在这里插入图片描述
具体代码

cmake_minimum_required(VERSION 3.19)
project(window003)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_PREFIX_PATH "E:/develop/Qt/Qt5.14.2/5.14.2/mingw73_64")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

set(QT_VERSION 5)
set(REQUIRED_LIBS Core Gui Widgets)
set(REQUIRED_LIBS_QUALIFIED Qt5::Core Qt5::Gui Qt5::Widgets)

add_executable(${PROJECT_NAME}
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
        )

if (NOT CMAKE_PREFIX_PATH)
    message(WARNING "CMAKE_PREFIX_PATH is not defined, you may need to set it "
            "(-DCMAKE_PREFIX_PATH=\"path/to/Qt/lib/cmake\" or -DCMAKE_PREFIX_PATH=/usr/include/{host}/qt{version}/ on Ubuntu)")
endif ()

find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)
target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBS_QUALIFIED})

if (WIN32)

    set(DEBUG_SUFFIX)
    if (CMAKE_BUILD_TYPE MATCHES "Debug")
        set(DEBUG_SUFFIX "")  # 此处去掉""d
    endif ()

    set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
    if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
        set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        endif ()
    endif ()
    if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E make_directory
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
    endif ()
    foreach (QT_LIB ${REQUIRED_LIBS})
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/bin/Qt${QT_VERSION}${QT_LIB}${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
    endforeach (QT_LIB)
endif ()

第二种qtcreator生成(简单)

在这里插入图片描述
具体代码:

cmake_minimum_required(VERSION 3.5)

project(window003 LANGUAGES CXX)
set(CMAKE_PREFIX_PATH "E:/develop/Qt/Qt5.14.2/5.14.2/mingw73_64")
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.

#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(Qt5 COMPONENTS Widgets REQUIRED)

if(ANDROID)
  add_library(window003 SHARED
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
  )
else()
  add_executable(window003
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
  )
endif()

target_link_libraries(window003 PRIVATE Qt5::Widgets)

6.重新加载为cmake项目

在这里插入图片描述

加载成cmake工程成功标志

在这里插入图片描述

7.CMakeList.txt修改后加载

当每次修改CMakeList.txt,clion编辑器右上角会提示自动重新加载项目配置,
选 ‘Enable Auto Reload’ 即可。
在这里插入图片描述

8.运行

此时无论在clion上还是qtcreator是运行,都可以

  • clion运行

在这里插入图片描述

  • qtcreator运行

在这里插入图片描述

9.为clion添加外部工具qtdesigner.exe

此我们需要再把CLion与QT Designer链接,设置ExternalTool,点击File->Setting->Tools->External Tools,增加一项配置。
在这里插入图片描述
在这里插入图片描述

至此,OK~

网站文章

  • 线程数据共享和安全 -ThreadLocal

    线程数据共享和安全 -ThreadLocal

    线程数据共享和安全 -ThreadLocal 1.什么是 ThreadLocal ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题. ThreadLocal ...

    2024-01-30 22:45:58
  • 【Android】App开发-动画效果篇

    【Android】App开发-动画效果篇

    在我们玩手机的过程中,如果我们点击某一个页面时,会出现一个页面动画加载或者动画效果的现象。现在我们就来看看App开发中是如何实现动画效果的。

    2024-01-30 22:45:53
  • map函数

    map函数 map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。我们...

    2024-01-30 22:45:45
  • RabbitMQ消息队列常见面试题总结

    RabbitMQ消息队列常见面试题总结

    RabbitMQ消息队列常见面试题总结;1、什么是消息队列?消息队列的优缺点?2、Kafka、ActiveMQ、RabbitMQ、RocketMQ的区别?3、如何保证消息不被重复消费?4、如何保证消息不丢失,进行可靠性传输?5、如何保证消息的有序性?6、如何处理消息堆积情况?7、如何保证消息队列的高可用?

    2024-01-30 22:45:38
  • 一百二十、Kettle——从Hive全量导入到ClickHouse

    一百二十、Kettle——从Hive全量导入到ClickHouse

    用kettle把Hive数据同步到ClickHouse

    2024-01-30 22:45:09
  • 22.0 Pycharm中编写js代码

    22.0 Pycharm中编写js代码

    【代码】22.0 Pycharm中编写js代码。

    2024-01-30 22:45:03
  • 使用openpyxl玩转excel数据

    访问单元格的基本操作

    2024-01-30 22:44:55
  • Vue组件化之VueComponent介绍

    Vue组件化之VueComponent介绍

    简介这篇文章主要介绍的是VueComponent函数。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta ...

    2024-01-30 22:44:26
  • chatgpt赋能python:Python实现隐藏Excel列的方法

    chatgpt赋能python:Python实现隐藏Excel列的方法

    本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应...

    2024-01-30 22:44:22
  • mongodb分片部署

    mongodb分片部署

    1、mongodb分片科普 (各种罗嗦) Replica Set(副本集): 副本集使其组内的每个成员(member)在不同的mongod实例中具有相同的数据备份,这样可以将来自应用服务器的请求访问(request visit)得以均匀的分布在Replica Set的每一个成员所在的mongod实例上,用以减缓单台mongod服务器在请求负载上的压力。在一定时限内Replica Set能完成

    2024-01-30 22:44:15