当前位置: 首页 > 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.dtcms.com/a/324080.html

相关文章:

  • 机器学习 [白板推导](八)[EM算法]
  • 机器学习-----K-means算法介绍
  • 打靶日常-XSS(反射型和存储型)
  • UE材质World Position 和 Object Position
  • 第十章:发布与展望 —— 让你的作品在 Edge 中闪耀
  • 力扣(买卖股票的最佳时机I/II)
  • 苍穹外卖-Day1 | 环境搭建、nginx、git、令牌、登录加密、接口文档、Swagger
  • 九、Linux Shell脚本:运算符与表达式
  • 在Ansys Simplorer中设计三相逆变器,并与Maxwell FEA耦合,实现160kW PMSM
  • AI浏览器与传统爬虫范式的技术冲突:重构互联网信息获取的伦理与实践
  • JVM调优好用的内存分析工具!
  • PHP版本控制系统:高效文档管理
  • 精准计算Word文档页数的PHP类
  • 【Redis】持久化方案——RDB和AOF
  • 5Python异常处理与模块导入全指南
  • nginx 反向代理传递原始域名
  • Linux 管道命令及相关命令练习与 Shell 编程、Tomcat 安装
  • Spring AOP 底层实现(面试重点难点)
  • 区块链让物联网真正链接万物
  • Mybatis和MybatisPlus的对比区分理解法
  • Linux入门指南:26个基础命令全解析
  • STM32F103芯片的启动过程
  • SAP学习笔记 - 开发57 - RAP开发 Managed App RAP action 之 Accept Travel 和 Reject Travel
  • 从色彩心理学看嵌入式设备UI设计:原则、挑战与实践
  • 数据结构:栈和队列(Stack Queue)基本概念与应用
  • SpringAi 通过大模型来实现调用自己的Api
  • 复现论文《基于深度强化学习的微能源网能量管理与优化策略研究》
  • 创建降阶模型用于搅拌槽中的涡流预测
  • nestjs官网推荐typeorm而不是prisma的原因
  • 第十六讲:AVL树和红黑树