使用CLion开发Qt应用的基本方法

原文链接

欢迎大家对于本站的访问 - AsterCasc

前言

开发桌面级应用程序上,QT本身的兼容性架构做的非常不错,但是单纯从Qt Creator开发的用户界面来说,确实不是很美丽,以习惯于Jetbrains全家桶的开发来说,许多按键和工作习惯都需要调整,参考Qt6Cractor初始化。所以我们考虑在使用Qt开发套件的情况下,在CLion的用户界面下工作,就很舒适了

实现

qmake工程的处理

对于qmake而言比较麻烦,因为CLion本身是不支持qmake直接构建的,所以这里有两个方案:

方案一:将工程转为CMake,这个也是Qt的相对推荐的方式,一则Qt的源码的构建已经从qmake改变为了Cmake,参考Build System Changes in Qt 6

The Qt 5 build system was built on top of qmake. In Qt 6, we ported the build system to CMake.

其次,qmake的构建方式可能在之后的版本中被弃用

qmake will still be supported in Qt 6 for user apps. But in Qt 7 it is likely to be completely dropped.
But cmake support is sure to get far more love now and int the future. So for long-term projects - better use cmake.

具体如果将qmake转为CMake可以参考官方博客Introducing qmake2cmake

pip install qmake2cmake && qmake2cmake_all camera-auth-pro/ --min-qt-version 6.0即可在camera-auth-pro目录下生成CMakeLists.txt,这个方法只适用于Qt6以上。Qt5即以下版本,简单的项目就自行转换把,复杂的项目可以参考使用AUTOMOC

方案二:通过自定义编译命令的方式来进行编译,这里CLion支持的是Compilation database方式配置,即compile_commands.json。对于Compliation database,我们在CMake中我们可以使用cmake-DCMAKE_EXPORT_COMPILE_COMMANDS=ON命令参数,或者在CMakeLists.txt中添加set(CMAKE_EXPORT_COMPILE_COMMANDS ON)来自动生成,或者使用Bear自动生成compile_commands.json

方案三:直接使用命令行编译和启动,这里要确认如果你按照了多个版本的Qt或者Cmake亦或C++版本需要在环境变量中确认使用的是否为项目所需的各种版本,具体可以参考Qt本身的配置:

可以在这里打开终端,测试命令的正确性,避免由于环境变量造成的构建失败。测试完成后将所需的环境变量配入系统或者CLion即可

构建命令的一般样式为:C:/Qt/5.15.2/mingw81_32/bin/qmake.exe Z:\workspace\qt\camera-auth-pro\camera-auth-pro\camera-auth-pro.pro -spec win32-g++ "CONFIG+=debug" ; C:/Qt/Tools/mingw810_32/bin/mingw32-make.exe -j8,小伙伴们根据自己的需求调整,然后在CLion配置命令行构建,配置如下图:

在设置环境变量的时候注意,目前版本CLion对于windows的支持不太好,如果你的版本也是通过export来设置环境变量的,你可以添加插件,也可以使用别名等来解决这个问题,我们这里选择直接通过分号来忽略export进行环境变量的设置:; $env:Path=aa;bb;cc;

CMake构建

转换为CMake后,一般构建CMakeLists.txt如下

# Project
cmake_minimum_required(VERSION 3.27)
project(camera-auth-pro VERSION 1.0 LANGUAGES C CXX)

# Config
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
#set(CMAKE_AUTOUIC ON)
set(CMAKE_PREFIX_PATH "C:/Qt/5.15.2/mingw81_32")

# Includes
include_directories(camera-auth-pro PRIVATE
        3rdparty/arctern
        3rdparty/opencv/include
        3rdparty/qBreakpad/include
        3rdparty/rkmedia
)

# Lib
find_package(Qt5 COMPONENTS
        Core
        Gui
        Sql
        Widgets
        Multimedia
        MultimediaWidgets
        Network
        REQUIRED)

link_directories(camera-auth-pro PRIVATE
        3rdparty/qBreakpad/lib/windows
)

# Define
add_definitions( -DRKAIQ )

# Sources
add_executable(camera-auth-pro main.cpp resouces.qrc
        camera/camera.cpp camera/camera.h
        camera/camera_core.cpp camera/camera_core.h
        camera/camera_rk.cpp camera/camera_rk.h
        camera/sample_common.cpp camera/sample_common.h
        constant/base.cpp constant/base.h
        constant/enums.h
        index.cpp index.h
        main.cpp
        nfc/nfc_tool.cpp nfc/nfc_tool.h
        nfc/serial_reader.h
        nfc/uart_port.h
        page/auth_table.cpp page/auth_table.h
        page/black.cpp page/black.h
        page/component/camera_frame.cpp page/component/camera_frame.h
        page/component/header.cpp page/component/header.h
        page/component/title.cpp page/component/title.h
        page/component/wait_auth.cpp page/component/wait_auth.h
        page/component/wait_net.cpp page/component/wait_net.h
        page/component/wait_server.cpp page/component/wait_server.h
        page/face_auth.cpp page/face_auth.h
        page/home.cpp page/home.h
        page/log_view.cpp page/log_view.h
        page/manager_setting.cpp page/manager_setting.h
        page/manager_setting_login.cpp page/manager_setting_login.h
        page/no_net.cpp page/no_net.h
        page/no_server.cpp page/no_server.h
        service/api.cpp service/api.h
        service/api_zf.cpp service/api_zf.h
        service/base_config.cpp service/base_config.h
        service/card_recognition.cpp service/card_recognition.h
        service/face_recognition.cpp service/face_recognition.h
        service/local_database.cpp service/local_database.h
        service/log_record.cpp service/log_record.h
        service/schedule.cpp service/schedule.h
        utils/ui_util.cpp utils/ui_util.h
)

target_link_libraries(camera-auth-pro PRIVATE
        Qt::Core
        Qt::Gui
        Qt::Multimedia
        Qt::MultimediaWidgets
        Qt::Network
        Qt::Sql
        Qt::Widgets
        qBreakpad
)

并且在Settings->Build, Execution, Deployment->Toolchains中配置正确的工具链:

即可让CLion完成正常编译工作,同时也可以在下方的CMake配置中选择自定义构建选项以及环境变量等,比如将Build directory修改为..\target防止构建文件对于版本管理的干扰等等

快捷键

如果你需要完全的QtCreator快捷键,那么可以在Settings->Keymap中调整。如果你只是希望修改部分按键,主要习惯更依赖IDEA。那么可以先切换到QtCreator键盘映射,检索所需快捷键,比如我们习惯于使用F4切换头文件和源文件,在改为QtCreator后,检索F4,查看到该快捷键名称为SwitchHeaderSource即可切回Windows更改该快捷键的键位

修改文件创建模板

对于一般C++项目的新文件创建,我们可以使用两种CLion提供的默认模板,在Setting->Editor->File and Code Templates中可以查到,分别是Qt ClassC++ Class。但是如果我们需要使用创建Qt类两种都不好用,Qt Class会默认携带ui这对于我们纯手写界面工作的并不友好,而C++ Class创建的模板东西太少,所以小伙伴们如果有需要应当是自己重新手写一个比较方便,模板的格式和Jetbrains的其他产品一样:

这里给出参考:

//.cpp
#[[#include]]# "${SYSTEM_FILENAME}.h"

${NAME}::${NAME}(QWidget *parent) : ${PARENT_CLASS}(parent) {
    
}

${NAME}::~${NAME}() {

}
//.h
#[[#ifndef]]# ${INCLUDE_GUARD}
#[[#define]]# ${INCLUDE_GUARD}

#[[#include]]# <${PARENT_CLASS}>

class ${NAME} : public ${PARENT_CLASS} {
Q_OBJECT

public:
    explicit ${NAME}(QWidget *parent = nullptr);
    ~${NAME}() override;
};

#[[#endif]]# //${INCLUDE_GUARD}

我们需要利用子模板来达到创建两个的目的,然后在创建的时候选择自己的模板即可成功创建头文件和源文件

参考资料

CMake Document

CLion Compilation database

CLion Qt projects

原文链接

欢迎大家对于本站的访问 - AsterCasc

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值