(Qt) cmake编译Qt项目

news2024/11/14 8:56:22

文章目录

  • 前言
    • 环境
    • cmake基础
  • 预备的项目代码
    • 文件资源路径
    • demo.pro
    • main.cpp
    • res.qrc
    • mywidget.cpp
    • mywidget.h
    • mywidget.ui
    • 运行效果
  • CMake
    • 文件资源路径
    • CMakeLists.txt
    • 生成与构建
  • END

前言

通常我们在编写qt的时候都是在Qt creator中。而如何在VS Code中编写qt就是本文需要解决的问题

环境

  • Qt配套环境
  • cmake

注意:本文的代码所在环境为windows,mingw环境

最好把qt一件套的配置设为我们需要的环境,不然同样是mingw编译器,用别的版本可能会很多奇怪的问题

cmake基础

(CMake) 从下载到构建第一个CMake应用_天赐细莲的博客-CSDN博客_cmake下载教程

(CMake) 库的生成和链接_天赐细莲的博客-CSDN博客_cmake 生成的静态库链接不全

预备的项目代码

先在Qt creator中编写一个小demo,保证是一份能跑的正常代码是一切的前提

文件资源路径

E:\QT\cmake\qt_creator\demo>tree /f
卷 新加卷 的文件夹 PATH 列表
卷序列号为 BAEE-AEDC
E:.
│  demo.pro
│  main.cpp
│  res.qrc
│
├─imgs
│      background.jpg
│
└─modules
        mywidget.cpp
        mywidget.h
        mywidget.ui

在这里插入图片描述

demo.pro

QT += core
QT += gui
QT += widgets

SOURCES += \
    main.cpp \
    modules/mywidget.cpp

HEADERS += \
    modules/mywidget.h

FORMS += \
    modules/mywidget.ui

RESOURCES += \
    res.qrc

main.cpp

#include <QApplication>

#include "./modules/mywidget.h"

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    MyWidget w;
    w.show();
    return a.exec();
}

res.qrc

<RCC>
    <qresource prefix="/">
        <file>imgs/background.jpg</file>
    </qresource>
</RCC>

mywidget.cpp

#include <QMessageBox>

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
    ui.setupUi(this);

    /// 测试资源
    QString style = R"(background : url(://imgs/background.jpg))";
    ui.pushButton->setStyleSheet(style);

    /// 测试元对象
    connect(ui.pushButton, &QPushButton::clicked, this, []() {
        QMessageBox::information(Q_NULLPTR, "元对象机制", "触发信号槽");
    });
}

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include "ui_mywidget.h"

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget {
    Q_OBJECT
private:
    Ui::MyWidget ui;

public:
    MyWidget(QWidget *parent = nullptr);
};
#endif  // MYWIDGET_H

mywidget.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MyWidget</class>
 <widget class="QWidget" name="MyWidget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MyWidget</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>240</x>
     <y>230</y>
     <width>271</width>
     <height>101</height>
    </rect>
   </property>
   <property name="text">
    <string>触发信号槽</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

在这里插入图片描述

运行效果

在这里插入图片描述

CMake

下面转到vscode中用cmake编译项目

文件资源路径

其实就是多了CMakeLists.txt文件

E:\QT\cmake\vscode\demo>tree /f
卷 新加卷 的文件夹 PATH 列表
卷序列号为 BAEE-AEDC
E:.
│  CMakeLists.txt
│  main.cpp
│  res.qrc
│
├─imgs
│      background.jpg
│
└─modules
        mywidget.cpp
        mywidget.h
        mywidget.ui

在这里插入图片描述

CMakeLists.txt

# 标注最低版本
cmake_minimum_required(VERSION 3.24)

# 设置项目名称
project(demo)

# 设置C++标准 C++11
set(CMAKE_CXX_STANDARD 11)

# 自动把ui转化为C++代码
# uic qtcmake.ui > ui_qtcmake.h
set(CMAKE_AUTOUIC ON)

# 自动生成元对象的C++代码
set(CMAKE_AUTOMOC ON)

# 自动生成资源文件
set(CMAKE_AUTORCC ON)

# 在项目中加入需要编译的文件
add_executable(${PROJECT_NAME}
    main.cpp
    res.qrc
    modules/mywidget.cpp
    modules/mywidget.h
    modules/mywidget.ui
)

# find_package 查找内部库
# 导入qt的库
# cmake通过qt5提供的查找方案,去查找对应的库
# 这里以查找 Widgets库 为例
find_package(Qt5 COMPONENTS Widgets REQUIRED)

# 根据自己电脑的环境,写死的指定Qt5_DIR这个变量
# 目的是寻找 Qt5Config.cmake 这个文件
set(Qt5_DIR B:/Qt/Qt5.14.2/5.14.2/mingw73_32/lib/cmake/Qt5)

# 指定qt依赖的动态库
# Qt5 自带连接头文件
target_link_libraries(${PROJECT_NAME}
    Qt5::Widgets
)

# 编译指令
# 没 set Qt5_DIR
# cmake -G "MinGW Makefiles" -S . -B build -DQt5_DIR=自己电脑的Qt5路径
# set 了 Qt5_DIR
# cmake -G "MinGW Makefiles" -S . -B build

生成与构建

# 下面两条指令在 CMakeLists.txt 所在路径操作

# 生成项目
# 用MinGW Makefiles 来执行cmake
# -S 源文件 .表示当前位置
# -B 构建目录 build 表示生成到build文件夹
cmake -G "MinGW Makefiles" -S . -B build

# 构建
# 到build目录进行构建
cmake --build ./build
E:\QT\cmake\vscode\demo>cmake -G "MinGW Makefiles" -S . -B build
-- The C compiler identification is GNU 7.3.0
-- The CXX compiler identification is GNU 7.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: B:/Qt/Qt5.14.2/Tools/mingw730_32/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: B:/Qt/Qt5.14.2/Tools/mingw730_32/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: E:/QT/cmake/vscode/demo/build

E:\QT\cmake\vscode\demo>cmake --build build
[ 14%] Automatic MOC and UIC for target demo
[ 14%] Built target demo_autogen
[ 28%] Automatic RCC for res.qrc
[ 42%] Building CXX object CMakeFiles/demo.dir/demo_autogen/mocs_compilation.cpp.obj
[ 57%] Building CXX object CMakeFiles/demo.dir/main.cpp.obj
[ 71%] Building CXX object CMakeFiles/demo.dir/modules/mywidget.cpp.obj
[ 85%] Building CXX object CMakeFiles/demo.dir/demo_autogen/EWIEGA46WW/qrc_res.cpp.obj
[100%] Linking CXX executable demo.exe
[100%] Built target demo

生成

注意:如果没有set(Qt5_DIR XXX)

则需要在编译指令中指定Qt5_DIR

cmake -G "MinGW Makefiles" -S . -B build -DQt5_DIR=自己电脑的Qt5路径

目的是获取Qt5的Qt5Config.cmake

执行cmake -G "MinGW Makefiles" -S . -B build后,没有提示错误

且生成build中有

  • cmake_install.cmake
  • CMakeCache.txt
  • Makefile

表示生成功

在这里插入图片描述

构建

执行cmake --build ./build后,没有提示错误

若一切正常

则此时在build中会生成目标文件目标文件_autogen的文件夹

并有三个文件夹,分别对应

  • set(CMAKE_AUTOUIC ON) ui
  • set(CMAKE_AUTOMOC ON) 元对象
  • set(CMAKE_AUTORCC ON) 资源

在这里插入图片描述

运行

注意,博主已经将qt的环境配置到关键变量中,因此可以直接运行

默认有一个命令行窗口

在这里插入图片描述




END

参考教程:cmake构建C++ qt项目_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

顺序表 —— 初始化、销毁、打印、增加、删除、查找、修改

1.何为线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直…

zotero导出pdf

今天老师给我改论文的时候布置了一个任务&#xff0c;让我把所有论文的pdf按格式打包发给她。可是之前我用zotero的时候都是在线保存的&#xff0c;有些是没有pdf的&#xff0c;怎么办&#xff1f;而且就算有pdf&#xff0c;他们的命名格式也五花八门&#xff0c;难道一个个手改…

kafka 消息日志原理 指定偏移量消费 指定时间戳消费

Kafka 日志详解 Apache Kafka日志存储在物理磁盘上各种数据的集合&#xff0c;日志按照topic分区进行文件组织&#xff0c;每一个分区日志由一个或者多个文件组成。生产者发送的消息被顺序追加到日志文件的末尾。 如上图所述&#xff0c;Kafka主题被划分为3个分区。在Kafka中&…

vscode使用跳板机(密钥)进入内网并连接内网中其它机器(密码)

经过简单测试 1、不能像xshell一样选择服务器的密钥登陆&#xff0c;只能通过将本机的公钥传到服务器上 2、不能使用本地socket5做代理登录 3、不能使用系统代理登录 一、使用密钥连接到跳板机 1、内网穿透 2、将本机公钥上传到服务器上 1&#xff09;建立密钥对 无论是win…

redis集群 mac安装

1.安装redis mac环境用brew install安装 brew install redis 安装好后默认配置启动单点服务 redis-server 注&#xff1a;brew默认程序安装在/usr/local/Cellar目录下 /usr/local/Cellar/redis 默认配置文件在 /usr/local/etc/redis.conf 2.创建配置文件 准备创建6个节…

谣言检测数据集

1 PHEME-R 这是一个在PHEME FP7项目的新闻学用例中收集和注释的数据集。这些谣言与9个不同的突发新闻相关。它是为分析社交媒体谣言而创建的&#xff0c;包含由谣言推文发起的推特对话&#xff1b;对话包括对这些谣言推文的回应推文。这些推文已经被注解为支持度、确定性和证…

VS2012安装教程

我要学只有我们两个人懂得C语言。 安装包&#xff1a;https://pan.baidu.com/s/1YR7Xk9Zlv7zQWCsERdVgIQ [提取码]&#xff1a;stvi 1、右键以管理员身份运行 “vs_ultimate.exe” 2、编辑软件安装位置&#xff0c;然后点击同意许可&#xff0c;之后点下一步即可&#xff01; 3…

mongoDB聚合查询

管道 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 聚合管道操作 可参考菜鸟文档&#xff1a;菜鸟文档 命令 功能描述 $project指定输出…

shell第四天作业——流程控制之循环

题目 一、for创建20个用户&#xff0c;用户前缀由用户输入&#xff0c;用户初始密码由用户输入。 二、for循环ping测试指定网段的主机&#xff0c;网段由用户输入。 三、使用for/while实现批量主机root密码的修改 一、for创建20个用户&#xff0c;用户前缀由用户输入&#x…

2022年已然要结束了,一起来分享下你的故事吧!2023年的接力棒已经递到手里,千言万语不如一句Fighting!

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

c++语法欠缺地方

sizeof是用来计算变量占多大内存的&#xff0c;单位是字节&#xff08;byte&#xff09;&#xff1b;sizeof 后面跟类型时&#xff0c;必须加上括号&#xff0c;例如sizeof(double);后面跟变量可以不用加括号&#xff0c;例如&#xff1a;sizeof d%d是以十进制形式输出有符号整…

CDP集群卸载过程

CDP集群卸载过程 1. 登录到Cloudera Manager&#xff0c;并停止整个集群服务。 2. 停用并移除所有Parcel 3. “停用”CDH7的Parcel。 4. 从主机删除”CDH6的Parcel 5. 删除集群 6. 登录server机器&#xff0c;停止CM Server服务 systemctl stop cloudera-scm-server 7. 移除…

如何实现高性能点赞(三)

数据库设计 数据库表中至少要包含三个字段&#xff1a;被点赞用户id&#xff0c;点赞用户id&#xff0c;点赞状态。再加上主键id&#xff0c;创建时间&#xff0c;修改时间就行了。 建表语句 对应的对象 UserLike 数据库操作 操作数据库同样封装在接口中 LikedService L…

【2.2】服务拆分--服务远程调用

服务拆分--服务远程调用1 案例--根据订单id查询订单功能2 远程调用方式分析2.1 注册RestTemplate2.2 发http请求3 总结1 案例–根据订单id查询订单功能 需求&#xff1a;根据订单id查询订单的同时&#xff0c;把订单所属的用户信息一起返回。 由上一节的测试结果可以看出&…

opencv-python常用函数解析及参数介绍(五)——腐蚀与膨胀

腐蚀与膨胀前言膨胀腐蚀开运算与闭运算礼帽与黑帽运用膨胀和腐蚀获得图像轮廓前言 有些时候图片上会有一些划痕或者污渍&#xff0c;会影响图片的质量&#xff0c;假设我有一张写有“艾醒”的图片&#xff0c;但是有花花绿绿的划痕和污渍&#xff0c;这时我们就可以运用腐蚀与…

五、Web自动化测试

Web自动化测试5.1 Selenium Web 自动化5.1.1 Selenium 和 Robot Framework SeleniumLibrary 库介绍安装 robotframework-seleniumlibrary导入 SeleniumLibrary5.1.2 Open Browser 和 Close Browser5.1.3 Input Text5.1.4 Click Button5.1.5 Click Element5.1.6 Click Link5.1.7…

2022CTF培训(十)IOT 相关 CVE 漏洞分析

附件下载链接 这里选择的设备是一款家用路由器&#xff0c;型号为 D-Link DIR-850L(EOL) 。由于该款路由器已停产&#xff0c;官网无法下载到固件&#xff0c;不过目前这个网站还能下载到相关的固件&#xff0c;当然附件中也会提供需要分析的固件。 固件解密 以 DIR850LB1_FW…

归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered)

目录 一、概念 1、归一化&#xff08;Normalization&#xff09;&#xff1a; 2、标准化&#xff08;Standardization&#xff09;&#xff1a; 3、中心化/零均值化&#xff08;zero-centered&#xff09;&#xff1a; 二、联系和差异&#xff1a; 三、标准化和归一化的多种…

Faster RCNN网络源码解读(Ⅵ) --- RPN网络代码解析(上)RPNHead类与AnchorsGenerator类解析

目录 一、代码作用&#xff08;rpn_function.py&#xff09; 二、代码解析 2.1 RPNHead类 2.2 AnchorsGenerator类 2.2.1 初始化函数__init__ 2.2.2 正向传播过程 forward 2.2.3 set_cell_anchors生成anchors模板 2.2.4 generate_anchors生成anchors 2.2.5 cached_g…

【Linux】vim 中批量添加注释

本期主题&#xff1a;vim 中批量添加注释博客主页&#xff1a;小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限&#xff0c;出现错误希望大家不吝赐 此文主要介绍两种方法&#xff1a;方法一 &#xff1a;块选择模式&#xff1b;方法二: 替换命令 &#x…