Qt,如何从零开始入门!


Qt 是一个功能全面的跨平台开发框架,不仅可以用于开发桌面应用,还在嵌入式系统中扮演重要角色。即使没有图形化 IDE(如 Qt Creator),你依然可以使用命令行工具和文本编辑器来快速构建功能强大的应用程序。本文将从手动构建 Qt 项目入手,逐步讲解如何创建、编译和优化一个 Qt 应用,助你快速入门。


在这里插入图片描述

1. 为什么选择 Qt?

Qt 的特点和优势使其成为众多开发者的首选,以下是它的几大亮点:

1.1 跨平台统一开发

Qt 提供一次编写、多平台运行的能力,无需针对不同平台编写多套代码。它支持的系统包括:

  • 桌面:Windows、Linux、macOS。
  • 移动端:Android、iOS。
  • 嵌入式:多种 Linux 平台(如 ARM 架构)。

1.2 模块化设计

Qt 框架采用模块化结构,核心模块包括:

  • QtCore:提供基础功能(如字符串、文件、时间操作)。
  • QtGui/QtWidgets:传统桌面 UI 开发模块。
  • QtNetwork:网络通信功能。
  • QtMultimedia:音视频播放与处理。
    开发者可以根据需求选择加载所需模块,优化性能和内存使用。

1.3 高效开发工具链

即使没有 Qt Creator,Qt 提供了以下高效的工具支持:

  • qmake:生成项目的 Makefile。
  • uic:将 .ui 文件转换为代码。
  • rcc:将资源文件嵌入到应用程序中。

这些工具让你可以通过命令行完成从项目创建到打包的完整开发流程。


2. 从零开始创建 Qt 项目

即使没有图形化的 Qt Creator IDE,你依然可以通过以下方式手动创建 Qt 项目。

2.1 准备开发环境

安装工具链
  1. 从 Qt 官网 下载 Qt 框架的开源版本,并安装适合你平台的工具链。
  2. 安装所需的编译器:
    • Linux:通常系统自带 GCC,如果没有安装:
      sudo apt install g++
      sudo apt install qtbase5-dev
      
    • Windows:推荐安装 MinGW,或者使用 MSYS2 安装 GCC。
    • macOS:通过 Homebrew 安装:
      brew install qt
      
验证安装

安装完成后,通过以下命令检查 Qt 工具是否可用:

qmake --version

如果显示版本信息,说明安装正确。


2.2 创建项目文件结构

创建一个名为 my_project 的文件夹,并在其中手动创建以下文件:

  • main.cpp:程序入口。
  • my_project.pro:项目配置文件,定义项目结构和依赖模块。

目录结构如下:

my_project/
├── main.cpp
├── my_project.pro

2.3 编写代码

main.cpp

这是一个简单的 Qt 应用,包含一个按钮,点击按钮时会弹出提示框。

#include <QApplication>
#include <QPushButton>
#include <QMessageBox>int main(int argc, char *argv[]) {QApplication app(argc, argv);QPushButton button("Click Me");QObject::connect(&button, &QPushButton::clicked, [&]() {QMessageBox::information(nullptr, "Hello", "欢迎学习 Qt!");});button.resize(200, 100);button.show();return app.exec();
}
my_project.pro

项目配置文件定义了项目的类型、源文件和依赖库:

TEMPLATE = app
TARGET = my_project
SOURCES += main.cpp
QT += core widgets

2.4 编译和运行项目

步骤 1:生成 Makefile

使用 qmake 命令,根据 .pro 文件生成 Makefile:

qmake my_project.pro
步骤 2:编译项目

运行 make(Linux/macOS)或 mingw32-make(Windows),根据 Makefile 生成可执行文件:

make

编译成功后,会在当前目录生成可执行文件 my_project(或 Windows 的 my_project.exe)。

步骤 3:运行程序

执行生成的程序:

./my_project

你会看到一个包含按钮的窗口,点击按钮会弹出消息框。


3. Qt 核心机制:信号与槽

3.1 什么是信号与槽?

Qt 的信号与槽机制用于对象间通信,是事件驱动模型的核心:

  • 信号:对象在特定事件发生时发出的通知(如按钮被点击)。
  • :处理信号的函数。

3.2 如何连接信号与槽?

信号与槽通过 QObject::connect 进行连接:

QObject::connect(sender, &Sender::signalName, receiver, &Receiver::slotName);

3.3 自定义信号与槽

除了使用内置信号与槽,还可以定义自定义信号与槽:

#include <QObject>class MyClass : public QObject {Q_OBJECT
public:signals:void mySignal();  // 定义信号public slots:void mySlot();    // 定义槽
};

3.4 信号与槽的高级用法

  • 线程间通信:信号与槽可以通过 Qt::QueuedConnection 在不同线程间传递数据。
  • 自动内存管理:当信号的发送者被销毁时,连接会自动断开,避免内存泄漏。

4. 优化项目和常见问题解决

4.1 优化建议

  1. 减少模块依赖
    .pro 文件中移除不必要的模块:
    QT -= gui
    
  2. 静态编译
    使用静态编译的 Qt 库,生成独立的可执行文件,减少依赖动态库。
  3. 启用硬件加速
    在嵌入式系统中,可以通过以下方式启用 OpenGL 加速:
    ./configure -opengl es2
    

4.2 常见问题解决

  1. 中文显示乱码

    • 在程序中设置支持中文的字体:
      QApplication::setFont(QFont("WenQuanYi Micro Hei"));
      
  2. 程序启动缓慢

    • 使用 strip 命令优化可执行文件大小:
      strip my_project
      
  3. 动态库缺失

    • 使用工具自动打包依赖库:
      windeployqt my_project.exe
      

5. 学习路径与下一步建议

学习路径

  1. 基础掌握

    • 熟悉 Qt 的信号与槽机制、事件模型和项目结构。
    • 学习核心模块(如 QtCoreQtWidgets)。
  2. 进阶探索

    • 使用多线程(QThread)开发复杂的后台任务。
    • 学习网络编程(QtNetwork)和多媒体处理(QtMultimedia)。
  3. 嵌入式开发

    • 配置交叉编译工具链,部署 Qt 应用到嵌入式设备。
    • 优化内存使用和渲染性能,裁剪不必要的模块。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle数据库的启动与关闭

一.oracle数据库的启动过程 启动实例&#xff08;Start the Instance&#xff09; 启动实例&#xff1a;一个Oracle数据库实例由内存结构和后台进程组成&#xff0c;启动实例时会加载这些内存结构和启动进程。实例是数据库的一个运行时环境&#xff0c;它包含了数据库的控制文…

最新版Chrome浏览器调用ActiveX控件之allWebOffice控件

allWebOffice控件概述 allWebOffice控件能够实现在浏览器窗口中在线操作微软Office及WPS办公文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档…

AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复

在Altium Designer软件中&#xff0c;切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤&#xff1a; 切换三维视图 在PCB设计界面中&#xff0c;2D切换3D&#xff0c;快捷键按住数字键盘中的“3”即可切换&#xff1b; 快捷键ctrlf&#xff08;或者vb快捷键也…

el-table 最简单的方法配置图片预览功能

el-table 最简单的方法配置图片预览功能 效果预览 1、安装插件 npm install v-viewernext viewerjs2、全局引入&#xff0c;配置main.js // main.js import VueViewer from v-viewer; import viewerjs/dist/viewer.css; app.use(VueViewer, {url: data-src, // 指定 data-* …

深度学习框架PyTorch中的Tensor详解

目录 ​编辑 引言 PyTorch Tensor基础 什么是Tensor&#xff1f; Tensor与NumPy ndarray Tensor的特性 多维数组 数据类型 设备兼容性 自动求导 广播机制 视图和副本 使用Tensor 创建Tensor 操作Tensor 移动Tensor 自动求导 结论 引言 在深度学习的浪潮中&a…

【实战】Oracle基础之控制文件内容的5种查询方法

关于Jady&#xff1a; ★工作经验&#xff1a;近20年IT技术服务经验&#xff0c;熟悉业务又深耕技术&#xff0c;为业务加持左能进行IT技术规划&#xff0c;右能处理综合性故障与疑难杂症&#xff1b; ★成长历程&#xff1a;网络运维、主机/存储运维、程序/数据库开发、大数…

【Docker】Docker配置远程访问

配置Docker的远程访问&#xff0c;你需要按照以下步骤进行操作&#xff1a; 1. 在Docker宿主机上配置Docker守护进程监听TCP端口 Docker守护进程默认只监听UNIX套接字&#xff0c;要实现远程访问&#xff0c;需要修改配置以监听TCP端口。 ‌方法一&#xff1a;修改Docker服务…

利用Ubuntu批量下载modis图像(New)

由于最近modis原来批量下载的代码不再直接给出&#xff0c;因此&#xff0c;再次梳理如何利用Ubuntu下载modis数据。 之前的下载代码为十分长&#xff0c;现在只给出一部分&#xff0c;需要自己再补充另一部分。之前的为&#xff1a; 感谢郭师兄的指导&#xff08;https://blo…

视频流媒体服务解决方案之Liveweb视频汇聚平台

一&#xff0c;Liveweb视频汇聚平台简介: LiveWeb是深圳市好游科技有限公司开发的一套综合视频汇聚管理平台&#xff0c;可提供多协议&#xff08;RTSP/RTMP/GB28181/海康Ehome/大华&#xff0c;海康SDK等&#xff09;的视频设备接入&#xff0c;支持GB/T28181上下级联&#xf…

飞凌嵌入式受邀亮相OpenHarmony人才生态大会2024

2024年11月27日&#xff0c;OpenHarmony人才生态大会2024在武汉洲际酒店举行。在这场汇聚了行业精英、技术大咖及生态伙伴的年度盛会上&#xff0c;飞凌嵌入式作为OpenHarmony社区的重要成员受邀出席&#xff0c;并展示了其在OpenHarmony 4.1系统适配方面的最新成果。 在大会的…

【智商检测——DP】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M 110; int f[N][M]; int main() {int n, k;cin >> n >> k;for(int i 1; i < n; i){int x;cin >> x;f[i][0] __gcd(f[i-1][0], x);for(int j 1; j < min(i, k)…

打造双层环形图:基础与高级渐变效果的应用

在数据可视化领域&#xff0c;环形图因其独特的展示方式而广受欢迎。今天&#xff0c;我们将通过ECharts库来创建一个具有双层渐变效果的高级环形图。本文将详细介绍如何实现这种视觉效果。 1. 环形图基础 首先&#xff0c;我们需要了解环形图的基本构成。环形图由内外两个圆…

开源的跨平台SQL 编辑器Beekeeper Studio

一款开源的跨平台 SQL 编辑器&#xff0c;提供 SQL 语法高亮、自动补全、数据表内容筛选与过滤、连接 Web 数据库、存储历史查询记录等功能。该编辑器支持 SQLite、MySQL、MariaDB、Postgres 等主流数据库&#xff0c;并兼容 Windows、macOS、Linux 等桌面操作系统。 项目地址…

MacOS 配置github密钥

MacOS 配置github密钥 1. 生成GitHub的SSH密钥对 ssh-keygen -t ed25519 -C "xxxxxxx.com" -f ~/.ssh/id_ed25519_github 其中 xxxxxxxxxxx.com 是注册github、gitee和gitlab的绑定账号的邮箱 -t ed25519:生成密钥的算法为ed25519&#xff08;ed25519比rsa速度快&…

网际协议(IP)与其三大配套协议(ARP、ICMP、IGMP)

网际协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;&#xff0c;又称互联网协议。是OSI中的网络层通信协议&#xff0c;用于跨网络边界分组交换。它的路由功能实现了互联互通&#xff0c;并从本质上建立了互联网。网际协议IP是 TCP/IP 体系中两个最主要的协议之…

永磁同步电机谐波抑制算法(11)——基于矢量比例积分调节器(vector PI controller,VPI controller)的谐波抑制策略

1.前言 相比于传统的谐振调节器&#xff0c;矢量比例积分调节器&#xff08;vector PI controller&#xff0c;VPI controller&#xff09;多一个可调零点&#xff0c;能够实现电机模型的零极点对消。因此VPI调节器也被广泛应用于交流控制/谐波抑制中。 2.参考文献 [1] A. G…

Windows下从命令行(Powershell/CMD)发送内容到系统通知中心

Windows下从命令行&#xff08;Powershell/CMD&#xff09;发送内容到系统通知中心 01 前言 在平时写脚本的时候&#xff0c;将日志等信息直接输出到控制台固然是最直接的&#xff0c;而如果是一些后台执行的任务&#xff0c;不需要时刻关注运行细节但是又想知道一些大致的情…

排序(数据结构)

排序&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 常见排序法 . 常见排序算法的实现 插入排序 1.直接插入排序 2.希尔排序( 缩小增量排序&#xff09; 希尔排序的特性总结&#x…

Android:生成Excel表格并保存到本地

提醒 本文实例是使用Kotlin进行开发演示的。 一、技术方案 org.apache.poi:poiorg.apache.poi:poi-ooxml 二、添加依赖 [versions]poi "5.2.3" log4j "2.24.2"[libraries]#https://mvnrepository.com/artifact/org.apache.poi/poi apache-poi { module…

基数排序(代码+注释)

#include <stdio.h> #include <stdlib.h>// 获取数组中的最大值 int GetMax(int* a, int n) {int max a[0];for (int i 1; i < n; i) {if (a[i] > max) {max a[i];}}return max; }// 对数组按照某个位数进行计数排序 void CountingSortForRadix(int* a, i…