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

Windows 下纯手工打造 QT 开发环境

用过 QtCreator 和 VS QT 插件,都觉得不是很理想。所以有了这个想法。
手工打造的 QT 的开发环境,是不需要安装上面两个程序的。

1、下载 vcpkg,编译 QT6
      下载地址:https://github.com/microsoft/vcpkg.git
       进入到 vcpkg 目录,在命令行上输入:
       vcpkg install qt:x86-windows-static
       或
       vcpkg install qt:x64-windows-static
       这样,QT6 的头文件、库文件(MT 类型的静态库)都有了,理论上就可以在 VS2022 中进行 QT 程序的开发了。
       因为还不能进行 UI 界面设计,所以说只是理论上。
       如果你只开发命令行程序,肯定是没有问题的了。

2、下载 QtCreator 程序
      因为 QT 是使用 QtCreator 来创建、编辑界面 (.ui 文件),所以我们还要下载 QtCreator 程序;
      不要到 QT 官网去下载,因为 QT 官网的 QtCreator 程序,是一个集成开发环境。是需要授权的。
      我们可以到 github 上,下载 QtCreator 程序。它只有新建、编辑界面功能。我们只需要这个功能。
      下载地址:https://github.com/qt-creator/qt-creator/releases/download/v14.0.2/qtcreator-windows-x64-msvc-14.0.2.7z
      下载下来,解压,保存到磁盘上。
      在磁盘任意位置,创建一个文本文件,输入内容:

        <?xml version="1.0" encoding="UTF-8"?><ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"/></widget></ui>

      保存。将这个文本文件后缀名修改为 .ui 。
      双击这个 .ui 文件,windows 会弹出打开方式对话框,选择你下载、保存的 qtcreator.exe 程序,并选中始终用这个程序打开。
      这样我们就可以使用 qtcreator 程序对 ui 文件(界面)进行界面设计了。
      至此,Windows 下,QT 开发环境搭建成功,可以进行程序开发了。
      无需复杂的 QtCreator 的安装过程。也无需在 VS2022 中安装 VS QT 插件。

下面2个步骤不是必须的,可按照你自己的习惯来。但你如果采用下面的方法,会给你带来很多方便。

3、编写 CMakeLists.txt 脚本
      采用 cmake 的方式,而不是 pro 的方式,当然是这种方式跨平台。而且 cmake 现在几乎算是标准了。 
      (qt 还提供一个 pro 到 cmake 的小工具:qmake2cmake。Introducing qmake2cmake)
      这是一个标准的 QT 程序 CMakeLists.txt 脚本:     

cmake_minimum_required(VERSION 3.5)#工程文件名称
set(ProjectName "test01")
project(${ProjectName} VERSION 0.1 LANGUAGES CXX)set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)#文件源码列表
set(PROJECT_SOURCESmain.cppmainwindow.cpp mainwindow.hmainwindow.ui
)qt_add_executable(${ProjectName} WIN32 MACOSX_BUNDLE MANUAL_FINALIZATION ${PROJECT_SOURCES})
target_link_libraries(${ProjectName} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
install(TARGETS ${ProjectName} BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

除了 #工程文件名称、#文件源码列表,不一样外,其它程序都可以套用这个模板。
因为我们用 VCPKG 编译的 QT6 是 MT 类型的静态库,所以上面的脚本需要修改,以符合 VCPKG 编译出来的 QT6 MT静态库;
完整的脚本如下(添加了 MT 编译,和修改了编译使用到的库文件):

cmake_minimum_required(VERSION 3.5)#工程文件名称
set(ProjectName "test01")   
project(${ProjectName} VERSION 0.1 LANGUAGES CXX)set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)#MT 编译
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
foreach(flag_varCMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASECMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFOCMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASECMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)if(${flag_var} MATCHES "/MD")string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")endif()if(${flag_var} MATCHES "/MDd")string(REGEX REPLACE "/MDd" "/MT" ${flag_var} "${${flag_var}}")endif()
endforeach(flag_var)find_package(QT NAMES Qt6 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)#文件源码列表
set(PROJECT_SOURCESmain.cppmainwindow.cpp mainwindow.hmainwindow.ui
)qt_add_executable(${ProjectName} WIN32 MACOSX_BUNDLE MANUAL_FINALIZATION ${PROJECT_SOURCES})
#vcpkg 的 bug,不能自动找到 bz2 brotlicommon brotlidec 库,手动添加上
target_link_libraries(${ProjectName} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets bz2 brotlicommon brotlidec)
install(TARGETS ${ProjectName} BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

这样,这个编译脚本就完成了。可以正常工作了。
而且它可以算是一个通用 cmake 编译脚本。
你只需修改工程文件名称,和源码列表,就可以用到其它 QT 程序中去,省了你编写 cmake 脚本的麻烦。
        
4、编写 cmd 批处理编译脚本
      在磁盘任意位置,建立 zqt.cmd 批处理文件。内容如下:

@echo off
color A:: 你的 QT 程序源代码目录
set "SourceFilePath=%1"
CD /D %SourceFilePath%:: 检查 VS2022 安装位置
for %%G in (Community,Professional,Enterprise) do (if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\%%G" (set "VSInstallPath=%ProgramFiles(x86)%\Microsoft Visual Studio\2022\%%G")if exist "%ProgramFiles%\Microsoft Visual Studio\2022\%%G" (set "VSInstallPath=%ProgramFiles%\Microsoft Visual Studio\2022\%%G")
)
if "%VSInstallPath%"=="" (echo "Visual Studio 2022 not found"pausegoto bEnd
)
call "%VSInstallPath%\VC\Auxiliary\Build\vcvars64.bat":: 你的 VCPKG 安装位置
set "VCPKGPTH=D:/vcpkg":: VC 的头文件、库文件搜索位置
set "VSQT6SDK=%VCPKGPTH%/installed/x64-windows-static"
set "VSSDKINC=%VSQT6SDK%/include"
set "VSSDKLIB=%VSQT6SDK%/lib"
set "INCLUDE=%VSSDKINC%;%INCLUDE%"
set "LIB=%VSSDKLIB%;%VCToolsInstallDir%atlmfc/lib/X64;%LIB%"
set "UseEnv=True"
set "InstallSDK=../_install"
set "BuildType= -DCMAKE_CONFIGURATION_TYPES=Release -DCMAKE_BUILD_TYPE=Release"
set "Path=%VSQT6SDK%/share;%Path%":: 删除临时编译目录,在当前源码目录下
if exist "./x64" (rd /S /Q  "./x64"
):: 用 VS2022 编译源码,会生成 sln 工程文件
cmake . -B "./x64" %BuildType% -DQT_DIR="%VSQT6SDK%/share/Qt6" -DQt6_DIR="%VSQT6SDK%/share/Qt6" -DCMAKE_INSTALL_PREFIX=%InstallSDK%
cmake "./x64"
cmake --build "./x64" --parallel --config Release --target install:: 检查编译是否有错误
if %errorlevel% NEQ 0 (echo ★★★★★ compile error. ★★★★★ pause
)cls:bEnd

这个批处理文件是个通用的文件。你只用修改一下你的 vcpkg 的安装位置就可以了。
在命令行上输入:zqt “你的 qt 程序目录”,就可以自动编译了。
也可以将你的 qt 程序源代码目录,鼠标拖放到这个 zqt.cmd 文件上,自动完成编译。
当然你也可以打开 sln 工程文件,编译,修改代码。

总结,这种方法的好处:
  1、模板化:cmakelists.txt 编译脚本具有通用性;zqt.cmd 批处理文件一次写成,以后也无需修改。自动完成 qt 程序编译;
  2、工程化:会生成 vs2022 的工程文件,sln 文件。你可以像对待 vc 程序一样对待 qt 程序了;
  3、静态化:编译的程序是静态链接,没有烦人的动态链接库dll。程序性能有所提高;
  4、简单化:比起 QtCreator 和 VS QT,编译过程简单的多了,节省了很多时间。也省了安装配置 QtCreator 和 VS QT 的烦恼;

小瑕疵的完善:
  由于vcpkg 编译问题,使得在编译 QT 程序时,会提示找不到 harfbuzz package。
  如果你像我一样,有强迫症,不想看见那些警告信息,那就修改 share\harfbuzz\harfbuzz-config.cmake 文件。
  https://download.csdn.net/download/dbyoung/89870466?spm=1001.2014.3001.5503
  这是我修改好的 harfbuzz-config.cmake 文件,下载,替换一下。就没有烦人的警告了。编译检查一次过,节省了编译时间。

相关文章:

Windows 下纯手工打造 QT 开发环境

用过 QtCreator 和 VS QT 插件&#xff0c;都觉得不是很理想。所以有了这个想法。 手工打造的 QT 的开发环境&#xff0c;是不需要安装上面两个程序的。 1、下载 vcpkg&#xff0c;编译 QT6 下载地址&#xff1a;https://github.com/microsoft/vcpkg.git 进入到 …...

k8s的安装和部署

配置三台主机&#xff0c;分别禁用各个主机上的swap&#xff0c;并配置解析 systemctl mask swap.target swapoff -a vim /etc/fstab配置这三个主机上的主机以及harbor仓库的主机 所有主机设置docker的资源管理模式为system [rootk8s-master ~]# vim /etc/docker/daemon.json…...

第十八篇:一文说清楚ICMP的底层原理

作为程序员或者网络工程师&#xff0c;有时候无法访问对方主机&#xff1b;导致这个现象的有很多原因&#xff0c;那要排查具体的网络原因&#xff0c;可能会用到ping的指令。而ping的底层实现是互联⽹控制报⽂协议&#xff08;ICMP&#xff09;。 ICMP 全称是 Internet Contr…...

【优选算法】(第三十二篇)

目录 ⼆进制求和&#xff08;easy&#xff09; 题目解析 讲解算法原理 编写代码 字符串相乘&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆进制求和&#xff08;easy&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCode&a…...

线程(四)线程的同步——条件变量

文章目录 线程线程的同步和互斥线程同步--条件变量什么是线程同步示例--条件变量的使用示例--使用两个线程对同一个文件进行读写示例--一个读者一个写者使用条件变量来实现同步 线程 线程的同步和互斥 线程同步–条件变量 是一个宏观概念&#xff0c;在微观上包含线程的相互…...

二维数组的旋转与翻转(C++)(上(这只是简单讲解))

二维数组的旋转与翻转&#xff08;C&#xff09; 引言 在计算机科学中&#xff0c;二维数组是一种常见的数据结构&#xff0c;广泛应用于图像处理、数据挖掘、机器学习等多个领域。二维数组的旋转与翻转是处理二维数据时经常需要用到的操作。本文将详细介绍二维数组的旋转与翻…...

【在Linux世界中追寻伟大的One Piece】System V共享内存

目录 1 -> System V共享内存 1.1 -> 共享内存数据结构 1.2 -> 共享内存函数 1.2.1 -> shmget函数 1.2.2 -> shmot函数 1.2.3 -> shmdt函数 1.2.4 -> shmctl函数 1.3 -> 实例代码 2 -> System V消息队列 3 -> System V信号量 1 -> Sy…...

【大数据】Spark弹性分布式数据集RDD详细说明

文章目录 整体介绍一、定义与特性二、操作与转换三、存储级别与持久化四、依赖关系与容错机制五、优化与性能调优 常见操作支持的数据格式1.文本文件 (Text Files)2. CSV 文件3. JSON 文件4. Parquet 文件5. Sequence Files6.Hadoop文件读取A. 读取HDFS上的文本文件B. 使用Hado…...

人参玉桂膏简介

一、产品基本信息 产品名称&#xff1a;人参玉桂膏 产品类别&#xff1a;植物饮料&#xff08;专为特定体质设计&#xff09; 配料&#xff1a;精选薏苡仁、荷叶、玉米须、赤小豆等纯然植物成分&#xff0c;辅以麦芽糖醇液、低聚果糖调节口感&#xff0c;陈皮、肉桂、人参&…...

消费者Rebalance机制

优质博文&#xff1a;IT-BLOG-CN 一、消费者Rebalance机制 在Apache Kafka中&#xff0c;消费者组 Consumer Group会在以下几种情况下发生重新平衡Rebalance&#xff1a; 【1】消费者加入或离开消费者组&#xff1a; 当一个新的消费者加入消费者组或一个现有的消费者离开消费…...

消息队列介绍

一、ActiveMQ 优点&#xff1a;性能单台&#xff08;6000&#xff09;成熟&#xff0c;已经在很多公司得到应用。各种协议支持好&#xff0c;有多个语言的成熟客户端 缺点&#xff1a;性能较弱&#xff0c;缺乏大规模吞吐的场景的应用&#xff0c;有江河日下之感 二、RabbitMQ…...

告别@Value,Spring Boot 3.3更优雅的配置注入方案

在Spring Boot的早期版本中&#xff0c;我们常使用Value注解来注入配置文件中的属性值。然而&#xff0c;这种方式虽然简单直接&#xff0c;却存在一些局限&#xff0c;比如它只能注入基本类型的值&#xff0c;并且需要显式地在每个需要注入的字段上使用注解。随着Spring Boot的…...

甲虫身体图像分割系统源码&数据集分享

甲虫身体图像分割系统源码&#xff06;数据集分享 [yolov8-seg-EfficientRepBiPAN&#xff06;yolov8-seg-C2f-FocusedLinearAttention等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challen…...

Qt - QMenu

QMenu 1、menu转string输出 //GlobalEnum.h #include <QObject> #include <QMetaEnum> class GlobalEnum : public QObject {Q_OBJECT public:EnumTest();enum Enum_Test{ZhangSan 0,WangWu,};Q_ENUM(Enum_Test) };#define EnumToString(e) \ QMetaEnum::fromTy…...

舵机驱动详解(模拟/数字 STM32)

目录 一、介绍 二、模块原理 1.舵机驱动原理 2.引脚描述 三、程序设计 main.c文件 servo.h文件 servo.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 舵机(Servo)是在程序的控制下&#xff0c;在一定范围内连续改变输出轴角度并保持的电机系统。即舵机只支持…...

dvwa:文件包含、文件上传

文件包含 本地文件包含&#xff08;敏感信息泄露&#xff09;和远程文件包含&#xff08;命令执行&#xff09; 本地文件包含一般包含一些本地的敏感文件&#xff0c;如&#xff1a;/etc/passwd或/etc/shadow等 远程文件包含能使得服务器代码执行&#xff0c;如包含黑客vps的…...

基于 C# .NET Framework 4.0 开发实现 WCF 服务实例详解(二)——实现Windows服务内嵌WCF服务

目录 引言 1. 创建一个新的Windows服务项目 2. 添加WCF服务 2.1 添加服务接口和实现 2.2 添加服务配置 3. 实现Windows服务 3.1 修改Service1类 3.2 在项目中添加ServiceInstaller 4. 安装和运行Windows服务 4.1 编译项目 4.2 使用InstallUtil.exe安装服务 …...

【ArcGIS/C#】调用控制台处理代码

代码示例 private static string[] run_conda_process(string command, Action<string> on_msg, CancellationTokenSource cancel){if (string.IsNullOrEmpty(command)){return new string[]{null,ArcGIS.Desktop.Internal.Core.Conda.Resources.Error_Unexpected + &qu…...

06_23 种设计模式之《适配器模式》

文章目录 一、适配器模式基础知识实例 一、适配器模式基础知识 适配器模式定义&#xff1a;将一个类的接口转换成客户希望的另一个接 口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可 以一起工作。 Client&#xff1a;客户端&#xff0c;调用自已需要的领域接口…...

Go语言--快速入门

Go语言特点 我们先看一下简单的Go语言程序 package mainimport "fmt"func main() { // 错误&#xff0c;{ 不能在单独的行上fmt.Println("Hello, World!") }我们可以看到外型非常像我们的JAVA&#xff0c;但是不需要&#xff1b;作为结尾&#xff0c;…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...