当前位置: 首页 > news >正文

CLion开发Qt桌面

IDE:CLion Qt

Qt版本:5.12


         学习正点原子的嵌入式Linux开发板时,使用Qt Creator写代码不是很方便,遂尝试使用CLion搭建Qt开发环境。

一、CLion的Qt环境搭建

1,配置工具链

        找到Qt的安装目录,此处为E:\Tools\Develop\Embedded\Qt。这里使用mingw64来编译工程,新建一个MinGW,把工具集的路径设置为Qt对应的mingw64路径

        找到Qt工程的目录,确保路径上没有中文。此处为正点原子imx6ull资料盘里的Qt综合例程源码

        在里面创建一个CMakeLists文件

2,使用CLion打开工程

        右键工程 ,使用CLion打开

        弹出的界面选择刚才创建的工具链

        由于创建的CMakeLists中没有写任何东西,所以构建时会出问题

二、编写CMakeLists

1,添加资源文件

        资源文件和头文件我们可以从.pro里获取,或者自己手动打或者使用通配符

        使用Alt + J 扩选“\”,把“\”删除。Ctrl +Alt + L格式化文件,使其规整。(后面会给出CMakeLists)

        Qt除了.cpp外还需要.h和.qrc,因为Qt会把.h和.qrc转为.cpp。由于CMake缓存目录里也会有.h之类的,故不能直接使用*.h

        也正是由于Qt编译的特殊性,它并不需要如一般程序指定头文件目录

2,添加Qt库 

         编写CMakeLists要注意,使用CLion创建Qt程序的CMakeLists有可能会导致库路径寻找失败。比如下图,使用find_package寻找后,头也不回的去找python用的虚拟环境Anaconda3的目录。而且是屡教不改

        最后编译的结果就是,头文件找到了,但链接的库确实python虚拟环境下的Qt库,会报一堆缺少__imp__*定义的错误

        解决办法就是在前面指定搜索目录,定义Qt5_DIR变量这种方法没有什么效果。如果你的搜索路径仍不变,那么删除CMake缓存,重新CMake

        查找模块和链接模块总是需要输入相同的名称,这里可以先定义一个变量存储,然后在变量里的名称添加前缀,即可得到链接库的名称

3,运行程序 

        直接运行程序,你会发现报下面错误,0xC0000135是很常见的错误,即缺少dll

        我们回到Qt,会发现Qt在运行这一步也直接执行程序,但它不会报错。这是因为Qt在执行程序时会添加一个环境变量——Qt库的目录,这样程序在运行时就能自动搜索dll,不会报错了。

        我们可以在构建目标里添加这个环境变量,点击紫色$

        点击+,然后添加PATH和对应的bin目录

        右边的bin目录是你所选的Qt库里的bin

E:\Tools\Develop\Embedded\Qt\5.15.2\mingw81_64\bin

        确定后再次执行,就可以正常运行了

4,完整CMakeLists

        C++标准可以不指定,后面删除了复制dll的步骤,改为添加环境变量

cmake_minimum_required(VERSION 3.30)project(QtDesktop)
set(CMAKE_CXX_STANDARD 11)#打开全局moc
set(CMAKE_AUTOMOC ON)
#打开全局uic
set(CMAKE_AUTOUIC ON)
#打开全局rcc,如果没有使用qrc,此句可以去掉
set(CMAKE_AUTORCC ON)#设置工程包含当前目录,使用*.ui文件时,需要加上这句,否则找不到头文件
set(CMAKE_INCLUDE_CURRENT_DIR ON)# ---------添加头文件目录----------
#include_directories(
#        cameramedia
#        fileview
#        weather
#        music
#        media
#        wireless
#        tcpclient
#        desktop
#        udpchat
#        photoview
#        iotest
#        sensor
#        iotest
#        radio
#)# ---------添加资源文件----------
file(GLOB_RECURSE SRC"main.cpp""qml.qrc""cameramedia/*.cpp""cameramedia/*.h""desktop/*.cpp""desktop/*.h""fileview/*.cpp""fileview/*.h""iotest/*.cpp""iotest/*.h""media/*.cpp""media/*.h""music/*.cpp""music/*.h""photoview/*.cpp""photoview/*.h""radio/*.cpp""radio/*.h""sensor/*.cpp""sensor/*.h""tcpclient/*.cpp""tcpclient/*.h""tcpserver/*.cpp""tcpserver/*.h""udpchat/*.cpp""udpchat/*.h""weather/*.cpp""weather/*.h""wireless/*.cpp""wireless/*.h"
)# 定义 Qt 模块名称
set(QT_MODULESCore Gui WidgetsMultimediaQml Network
)# ------------查找Qt库------------
set(CMAKE_PREFIX_PATH "E:/Tools/Develop/Embedded/Qt/5.15.2/mingw81_64")
find_package(Qt5 REQUIRED COMPONENTS ${QT_MODULES}
)
# ------------添加可执行文件------------
add_executable(${PROJECT_NAME} ${SRC})
# ------------链接Qt库------------
set(QT_LIBRARIES)
foreach(MODULE ${QT_MODULES})list(APPEND QT_LIBRARIES "Qt5::${MODULE}")
endforeach()
target_link_libraries(${PROJECT_NAME} ${QT_LIBRARIES})

三、添加外部工具

1,Designer

        打开设置,找到外部工具,再点击+添加工具,desinger程序是在你所用的Qt库的bin目录(前面的环境变量也是这个)

        传入的实参就是需要运行的文件名,工作目录选择工程目录

$FileName$
$ProjectFileDir$

2,UIC

        与前面相同,再添加一个外部工具Qt UIC,它的目的是把.ui文件转为.h文件。所以这里的实参,是把.ui文件输出为.h。

        所谓实参就是给外部工具传入的参数,下面这一句等价为在命令行里输入

uic $FileName$ -o ui_$FileNameWithoutExtension$.h

里面的变量名会被替换为具体的文件名

$FileName$ -o ui_$FileNameWithoutExtension$.h
$FileDir$

        实际上前面在CMakeLists里开启了自动UIC,它会自动把添加进来的ui文件转为.h。此外,正点原子这个工程使用的是Qt Quick 技术栈,并非Qt Widgets,事实上是用不到UIC的

3,使用

        使用时,可以右键对应文件,选择对应的外部工具

 4,QMLSCENE(预览QML)

        这个工具挺有用的,是预览qml文件用的,此工具是位于Qt库里的qmlscence.exe

E:\Tools\Develop\Embedded\Qt\5.15.2\mingw81_64\bin\qmlscene.exe
$FileName$
$FileDir$

 

        需要说明一点,正点原子的相关例程里,由于qml会导入一些别的资源,那么这个预览工具就不能正常预览了,它适合单个无依赖文件或者依赖都在同一个目录

5,设计无法开启

        刚使用Qt Creator时,左边栏中【设计】是灰的,这需要开启一个插件,然后重启

        点击上面的【帮助】,然后点击【关于插件】,把QmlDesigner勾选上,确定后再重启

        接下来就可以自由切换编辑和设计模式了

        在【编辑】->【偏好选项】里找到Qt Quick,可以选择默认打开Qt Design Studio

        界面元素设计这块,还是Qt Creator比较好用,可以无缝衔接Qt Design Studio

四、使用Qt Creator原生工具

        除了使用CMake构建外,也可以通过外部工具的方法来使用Qt Creator配置好的构建工具和命令。不过实际使用过程中,反应巨慢,提示信息又很反人类,还不如直接使用Qt Creator。不建议使用,但可以作为兴趣了解一下。

1,Qt Creator的构建运行过程

        Qt Creator的构建和运行都在项目配置里写好的,在下图的项目配置界面,可以看到构建这个步骤实际上是分为两步执行的,qmake和make步骤

        把qmake步骤展开,可以看到下面调用

E:/Tools/Develop/Embedded/Qt/5.15.2/mingw81_64/bin/qmake.exe E:\Program\Embedded\Qt\imx6ull\QDesktop\QDesktop.pro -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug" && E:/Tools/Develop/Embedded/Qt/Tools/mingw810_64/bin/mingw32-make.exe qmake_all

        这个调用过程看起来只有qmake这个过程,实际上还有make过程,从命令里可以看到“&&”符号,这个在终端调用里会把前面两个程序运行都执行。不过如果放在CLion的外部工具或者构建命令里,是不能使用"&&"的,因为对于它来说,一个外部工具或者构建命令只能运行一个程序,实参里一般是不允许再运行别的程序,除非这个外部工具是终端

        所以qmake步骤实际是有下面两个过程

  • 先qmake生成Makefile
qmake.exe E:\Program\Embedded\Qt\imx6ull\QDesktop\QDesktop.pro -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug" 
  • 再使用make构建qmake_all目标
mingw32-make.exe qmake_all

        至于下面这个make步骤要做的事情很简单,编译all目标,“in”及“in”后面的内容并不是参数,只是告诉你在哪个目录。

make -j16

        清理步骤与前面的make all一样,清晰明了

        运行步骤前面说过,添加了一个环境变量用于检索dll

2,CLion自定义构建目标

        从前面的分析可知,构建过程可以拆分为三个步骤,qmake生成Makefile、make执行qmake_all目标、make执行all目标,清理步骤只有一个目标,即make执行clean目标

        先在构建目标里找到自定义构建应用程序

        前面分析过构建有三个目标,我们要确保最后一个是make all,不然没法编译源文件。也就是说构建要做的事情是make all,那么其他两个步骤需要放在构建前,我们在下面的【执行前】添加一个运行外部工具

        先添加一个qmake,用于生成Makefile,程序是所选Qt库bin目录里的程序,实参就是前面Qt Creator里qmake执行的命令。工作目录会在选择程序后默认为程序所在目录,由于已经指定了.pro文件,那么这个工作目录可以不用改

E:\Program\Embedded\Qt\imx6ull\QDesktop\QDesktop.pro -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug"

        再添加一个外部工具,用于执行make qmake_all。这个make命令是需要在前面生成的Makefile的目录执行,我们可以在make后加一个参数"-C"来指定工作目录,或者直接把工具目录改为MakeFile所在目录

-C E:\Program\Embedded\Qt\imx6ull\QDesktop\build\Desktop_Qt_5_15_2_MinGW_64_bit-Debug qmake_all

        添加好外部工具之后,记得顺序不能乱,我们要使用的这两个外部工具,qmake是在前面的

        点击确定后,把这个运行外部工具给放到构建前面

        接下来是添加构建目标,点击这个【配置自定义构建目标】,这里已经提前配置过了,所以会有一个目标

        配置的这个目标,使用的工具链是前面配置过的,构建目标和清理目标就是make -j16和make clean -j16

        点击旁边的三点,添加外部工具,与前面一致,这里就不赘述了

        添加可执行文件这一步,就添加build目录的QDesktop程序,环境变量与前面一样,添加Qt库bin目录。

        需要注意的是,我们这里只是简单配置,所以不会自动生成build相关目录,如果没有在Qt Creator里预先构建一遍的话,这里运行这个自定义目标会提示缺少目录什么的。

        最后我们构建这个目标,从提示信息里就可以窥视到,这完全就是按照Qt Creator的路子走一遍(当然下面检测到了项目没有做任何改变)

        我们在main里随便定义一个变量

        哪怕这个变量人畜无害,也会罗里吧嗦给出一堆警告(不是报错),当然这可能是生成的Makefile里开了-Wall

        运行与前面相同,只不过它会在运行前坚定地指定构建三步骤

        除了按部就班地使用自定义构建目标外,也可以通过CMakeLists里添加自定义命令达到一样的效果,并且CMakeLists里有更丰富的命令,比如检测目录是否存在等

相关文章:

CLion开发Qt桌面

IDE:CLion Qt Qt版本:5.12 学习正点原子的嵌入式Linux开发板时,使用Qt Creator写代码不是很方便,遂尝试使用CLion搭建Qt开发环境。 一、CLion的Qt环境搭建 1,配置工具链 找到Qt的安装目录,此处为E:\Tools\…...

09_异步加载_单例模式_常量类配置_不可销毁

1.首先在 资源加载服务层ResSvc.cs中添加 自定义异步加载函数 using UnityEngine; using UnityEngine.SceneManagement; //异步加载 命名空间 //功能 : 资源加载服务 public class ResSvc : MonoBehaviour{public void InitSvc(){Debug.Log("Init ResSvc...");}//自定…...

士的宁(strychnine)的生物合成-文献精读104

Biosynthesis of strychnine 士的宁(strychnine) 又名 番木鳖碱 的生物合成 摘要 士的宁(番木鳖碱)是一种天然产物,通过分离、结构阐明和合成努力,塑造了有机化学领域。目前,士的宁因其强大的…...

【开源免费】基于Vue和SpringBoot的常规应急物资管理系统(附论文)

本文项目编号 T 159 ,文末自助获取源码 \color{red}{T159,文末自助获取源码} T159,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计

源码 论文 下载地址: ​​​​c​​​​​​c基于JAVA的网络通讯系统设计与实现(源码系统论文)https://download.csdn.net/download/weixin_39682092/90299782https://download.csdn.net/download/weixin_39682092/90299782 第1章 绪论 1.1 课题选择的…...

ray.rllib 入门实践-2:配置算法

前言: ray.rllib的算法配置方式有多种,网上的不同教程各不相同,有的互不兼容,本文汇总罗列了多种算法配置方式,给出推荐,并在最后给出可运行代码。 四种配置方式 方法1 import os from ray.rllib.algori…...

2025-01学习笔记

1.SpEL 第一次知道它的全称 Spring Expression Language(SpEL) Value("${my.property}") private String myProperty; Value("#{2 * 3}") private int computedValue; 2.逃逸分析 逃逸分析:当一个对象在方法中被定…...

多线程执行大批量数据查询

// 创建一个固定大小的线程池ExecutorService executorService Executors.newFixedThreadPool(5);// 创建多个查询任务List<Callable<List<ShopCompareBase>>> tasks new ArrayList<>();//查询门店 切割,分成十份List<List<String>> sho…...

ChatGPT高效处理图片技巧使用详解

ChatGPT&#xff0c;作为OpenAI开发的预训练语言模型&#xff0c;主要用于生成自然语言文本的任务。然而&#xff0c;通过一些技巧和策略&#xff0c;我们可以将ChatGPT与图像处理模型结合&#xff0c;实现一定程度上的图像优化和处理。本文将详细介绍如何使用ChatGPT高效处理图…...

leetcode——相交链表(java)

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…...

RubyFPV开源代码之系统简介

RubyFPV开源代码之系统简介 1. 源由2. 工程架构3. 特性介绍&#xff08;软件&#xff09;3.1 特性亮点3.2 数字优势3.3 使用功能 4. DEMO推荐&#xff08;硬件&#xff09;4.1 天空端4.2 地面端4.3 按键硬件Raspberry PiRadxa 3W/E/C 5. 软件设计6. 参考资料 1. 源由 RubyFPV以…...

麦田物语学习笔记:创建TransitionManager控制人物场景切换

基本流程 制作场景之间的切换 1.代码思路 (1)为了实现不同场景切换,并且保持当前的persistentScene一直存在,则需要一个Manager去控制场景的加载和卸载,并且在加载每一个场景之后,都要将当前的场景Set Active Scene,保证其为激活的场景,在卸载的时候也可以方便调用当前激活的场…...

后端SpringBoot学习项目-用户管理-增删改查-service层

仓库地址 在初版代码中&#xff0c;已经实现了基础的增删改查。 但是&#xff0c;逻辑处理都放在Controller层中并没有分为Service层&#xff0c;所以&#xff0c;代码升级时候必须补充上去。 代码结构 升级后的代码结构有所变化。 --common 公共插件 --controller…...

机器学习11-学习路径推荐

机器学习11-学习路径推荐 本文希望摒除AI学习商业宣传要素&#xff0c;推荐一条极简的AI学习路线&#xff01;推荐内容均为在线免费内容&#xff0c;如果有条件可以咨询专业的培训机构&#xff01; 文章目录 机器学习11-学习路径推荐[toc] 1-AI培训路线第一阶段 Python-人工智能…...

[ACTF2020 新生赛]Upload1

题目 以为是前端验证&#xff0c;试了一下PHP传不上去 可以创建一个1.phtml文件。对.phtml文件的解释: 是一个嵌入了PHP脚本的html页面。将以下代码写入该文件中 <script languagephp>eval($_POST[md]);</script><script languagephp>system(cat /flag);&l…...

【PyTorch】0.初识:从吃货角度理解张量

0.初识张量 PyTorch 是一个 Python 深度学习框架&#xff0c;它将数据封装成张量&#xff08;Tensor&#xff09;来进行运算。PyTorch 中的张量就是元素为同一种数据类型的多维矩阵。在 PyTorch 中&#xff0c;张量以 "类" 的形式封装起来&#xff0c;对张量的一些运…...

医学图像分析工具09.1:Brainstorm安装教程

1. 安装前准备 **官方安装包和数据&#xff1a;**https://neuroimage.usc.edu/bst/download.php **官方安装教程&#xff1a;**https://neuroimage.usc.edu/brainstorm/Installation Matlab 版本要求&#xff1a; 有 Matlab&#xff1a; R2009b (7.9) 或更高版本没有 Matlab&…...

springboot基于Spring Boot的智慧养老服务系统的设计与实现

系统介绍&#xff1a; 智慧养老服务系统是一种运用现代科技手段&#xff0c;整合各类养老资源&#xff0c;为老年人提供全方位、个性化服务的综合性平台。该系统通过智能化设备、大数据分析、云计算等技术&#xff0c;实现对老年人健康状况、生活需求的实时监控与精准匹配&…...

Linux内核中IPoIB驱动模块的初始化与实现

InfiniBand(IB)是一种高性能的网络互连技术,广泛应用于高性能计算(HPC)和数据中心。为了在InfiniBand网络上运行标准的IP协议栈,Linux内核提供了IP over InfiniBand(IPoIB)驱动模块。IPoIB允许在InfiniBand网络上传输IPv4和IPv6数据包,从而使得现有的IP应用程序能够无…...

WPS计算机二级•幻灯片的基础操作

听说这是目录哦 PPT的正确制作步骤&#x1f6e3;️认识PPT界面布局&#x1f3dc;️PPT基础操作 快捷键&#x1f3de;️制作PPT时 常用的快捷技巧&#x1f3d9;️快速替换PPT的 文本字体&#x1f303;快速替换PPT 指定文本内容&#x1f305;能量站&#x1f61a; PPT的正确制作步…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...