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

Qt—— 下载、工具介绍以及新建项目

QT下载与配置

下载地址:

https://www.qt.io/download-qt-installer-oss

启动安装程序,按如下步骤安装:

在这里插入图片描述

在这里插入图片描述

配置环境变量:
在这里插入图片描述

在系统环境变量Path添加:

G:\Qt\6.7.3\mingw_64\bin

Qt自带的工具

Assistant

在这里插入图片描述

离线版本的官方文档

Designer

在这里插入图片描述

Qt 设计师,图形化设计工具。结合Qt creator使用

Linguist

在这里插入图片描述

Qt 语言家,支持国际化

Qt

在这里插入图片描述

Qt 命令行

Qt Creator

在这里插入图片描述

Qt 集成开发工具

新建项目来写一个GUI程序

在这里插入图片描述

选择构建系统- Cmake for Qt 5 dan Qt 6:

在这里插入图片描述

构建系统:通过写Qt写的程序,涉及到一些列的“元编程”技术,通过代码来生成代码

Qt框架会在编译的时候,自动先调用一系列的生成工具,基于自己写的代码,生成一系列的其他C++代码,最终编译的代码,也是最后生成的这些代码

指定类名和文件名

在这里插入图片描述

使用 Qt Creator 创建项目,会自动生成一些代码出来,生成的代码就包含一个类(Class name),此处就是要选择这个自动生成的类的父类(Base class)是谁

Base class 有三种:

  • QMainWindows:完整的应用程序窗口,可以包含菜单栏、工具栏、状态栏
  • QWidget:表示一个控件,窗口上的一个具体元素,如输入框、按钮等
  • QDialog:表示一个对话框
  • 注:Qt中内置的类都是由Q开头的

上图中的文件名 Header file, Source file和类名Class name是关联的

form file:

Qt中创建图形化界面有两种方式:

  • 一种是通过C++代码的方式创建页面
  • 一种是通过 form file,以图形化的方式来生成页面。此时就可以通过 Qt designer或直接使用 Qt creator来编辑这个ui文件从而以图形化的方式快速方便的生成图形界面

选择翻译文件

在这里插入图片描述

涉及到国际化,不关注

运行生成后的代码

创建好一个空项目后,会生成以下代码:

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
  • QApplication,编写一个Qt图形化界面,必须要有这样一个对象

  • Widget:这个类就是上面我们指定的继承QWidget的子类

    • .show()方法:显示控制件
    • .hide()方法:隐藏控制件
  • .exec():让程序跑起来

    • 注意,该exec和Linux的exec进程程序替换没有任何关系

我们直接运行

在这里插入图片描述

可以得到一个空白的图形化界面

解释生成后的代码

创建好项目后,根据我们创建项目时选定的基类,会生成继承类的定义和实现:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H
  • Q_OBJECT

    • 其是Qt内置的一个宏,宏本质就是文本替换,当Q_OBJECT被展开后,会生成一大堆代码
    • Qt有一个非常核心的机制:“信号”和“槽”,如果某个类想要使用这个机制,就需要引入这个宏Q_OBJECT
  • QWidget *parent = nullptr

    • Qt中引入了”对象树“这一机制,对象树是一棵多叉树
    • 创建Qt对象,可以把这个对象挂到“对象树”上,此时就需要指定父节点
  • Ui::Widget *ui:和form file密切相关

widget.cpp

#include "widget.h"
#include "./ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}
  • ui->setupUi(this):把form file生成的界面和widget类关联起来

同时也会生成一个ui文件,该文件的文件类型为.xml

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Widget</class><widget class="QWidget" name="Widget"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>Widget</string></property></widget><resources/><connections/>
</ui>
  • 在Qt中使用该文件的目的就是描述:程序的界面应该是什么样子的
  • 进一步,Cmake会调用相关工具,根据这个.xml文件生成一些C++代码,从而把完整的界面构造出来

上面所说的C++代码,具体到这里创建的项目,被Cmake编译后,就会生成文件:ui_widget.h

/********************************************************************************
** Form generated from reading UI file 'widget.ui'
**
** Created by: Qt User Interface Compiler version 6.7.3
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName("Widget");Widget->resize(800, 600);retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H
http://www.xdnf.cn/news/1275805.html

相关文章:

  • 从0开始的中后台管理系统-5(userList页面功能实现)
  • 40.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--初始化网关
  • Pytorch进阶-timm库-00快速开始
  • (三)全栈(部署)
  • 精准计算Word文档页数的PHP类
  • 数据结构-deque(双端队列)和queue(队列)区别
  • 【npm、yarn、pnpm】特点对比,按需选择
  • Java 后端性能优化实战:从 SQL 到 JVM 调优
  • 分布微服务电商订单系统Rust编码开发[上]
  • 数组练习(一)
  • vuhub drippingblues靶场攻略
  • #4:MinIO分片上传和集群部署
  • 攻击实验(ARP欺骗、MAC洪范、TCP SYN Flood攻击、DHCP欺骗、DHCP饿死)
  • 安全运维的核心
  • C语言——深入理解指针(二)
  • 【递归、搜索与回溯算法】递归算法
  • Ollama+Deepseek+Docker+RAGFlow打造自己的私人AI知识库
  • 计算机网络:超网即路由聚合一定需要连续的IP地址吗?
  • 秋招春招实习百度笔试百度管培生笔试题库百度非技术岗笔试|笔试解析和攻略|题库分享
  • RabbitMQ面试精讲 Day 19:网络调优与连接池管理
  • Spring Boot 注解详解:@RequestMapping 的多种用法
  • 十、Linux Shell脚本:流程控制语句
  • Day41--动态规划--121. 买卖股票的最佳时机,122. 买卖股票的最佳时机 II,123. 买卖股票的最佳时机 III
  • 网闸技术解析:如何实现对国产数据库(达梦/金仓)的深度支持
  • 我如何从安全运维逆袭成企业CSO
  • WiFi原理与WiFi安全
  • 【软考中级网络工程师】知识点之 IPv6 全解析
  • 基于python高校固定资产管理系统
  • 【在线五子棋对战】十二、http请求处理
  • 【经典算法】二叉树最小深度详解:递归解法与可视化分析