QT初识(2)

QT初识(2)

  • 创建好项目之后,多了些什么东西?
    • main.cpp
    • widget.h
    • widget.cpp
    • widget.ui
    • .pro项目工程文件

我们今天来继续了解QT。如果没看过上一次QT初识的小伙伴可以点击这里:

https://blog.csdn.net/qq_67693066/article/details/137194408

创建好项目之后,多了些什么东西?

创建好的项目会多出这么几个文件:
在这里插入图片描述
我们先从main.cpp程序的入口开始看:

main.cpp

main.cpp中的代码还是比较简单的:

#include "widget.h"

#include <QApplication>

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

这段C++代码是使用Qt库开发GUI应用程序的标准入口点代码,它创建并运行一个基于QWidget的简单桌面应用程序。下面是逐行解释:

#include "widget.h"
  • 这一行包含了名为widget.h的头文件,通常这是用户自定义的窗口类声明的地方。在Qt应用程序中,Widget通常是指继承自QWidget类的自定义窗口类,它定义了应用程序主窗口的界面布局和功能。
#include <QApplication>
  • 这行代码包含了QApplication类的头文件,这是所有Qt GUI应用程序的基础类,负责管理应用程序的事件循环、应用程序的生命周期以及窗口部件间的消息传递。
int main(int argc, char *argv[])
{
  • 这是C++程序的主入口函数,接受两个参数:argc(命令行参数的计数)和argv(指向命令行参数数组的指针)。
    QApplication a(argc, argv);
  • 创建一个QApplication对象实例a,传入argcargv参数,这样Qt应用程序就可以处理命令行参数,并且能够正确初始化事件循环和应用程序环境。
    Widget w;
  • 创建一个Widget类的对象w,这个对象将是应用程序的主窗口或用户界面。

注意一下,这个Widget类的对象是我们创建项目时勾选的,所以就生成了Widget类这么一个对象。同时要注意Widget的父类是QWidget。

    w.show();
  • 调用Widget对象wshow()函数,使窗口可见,也就是在屏幕上显示应用程序窗口。
    return a.exec();
  • 调用QApplication对象aexec()方法,开始执行Qt应用程序的事件循环。在此期间,程序会监听用户的输入、处理窗口消息和其他事件,直到退出事件(如关闭主窗口、接收到退出命令等)发生。exec()函数返回一个整数值,通常用来表示应用程序的退出状态。

总结起来,这段代码的主要作用是初始化Qt应用程序,创建并显示一个Widget窗口,并开始处理用户交互和系统事件,直至应用程序结束。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

最重要的一部分在于如何理解和使用这个Widget类,它是继承自QWidget并结合Qt的元对象系统的GUI组件的基础结构:

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};

1. 继承自QWidget

Widget类作为用户界面的主要容器,通过继承自QWidget获得了显示窗口以及容纳各种Qt GUI控件的能力。QWidget是所有可显示窗口部件的基础类,它提供了基本的窗口管理、事件处理、布局管理以及绘图环境等功能。

2. Q_OBJECT宏

Q_OBJECT宏在这个类的声明中是非常关键的,它让Widget类能够利用Qt的元对象系统。元对象系统提供了诸如信号和槽机制(用于对象之间的异步通信)、属性系统(用于动态改变对象状态)以及国际化支持等功能。没有Q_OBJECT宏,这些特性将不可用。

3. 构造函数和析构函数

  • Widget(QWidget *parent = nullptr);
    这个构造函数初始化一个Widget对象,可以指定一个父窗口部件。如果指定了父窗口,则该Widget将成为父窗口的孩子,这会影响它的行为,比如当父窗口关闭时,子窗口也会自动关闭;另外,在布局管理上,子窗口的大小和位置通常由父窗口决定。
  • ~Widget();
    这是析构函数,当Widget对象生命周期结束时,系统会自动调用它来释放资源。在此处可能需要手动清理或者删除Ui::Widget对象,但通常情况下,如果Ui::Widget是在Widget类的构造函数中正确初始化的(例如通过setupUi()方法),那么在Widget析构时,Ui::Widget也会随之释放。

4. 成员变量Ui::Widget *ui

  • private: Ui::Widget *ui;
    这个私有成员变量指向一个Ui::Widget类型的对象,它是用户界面的具体实现。在实际的.cpp文件中,通常会有类似这样的代码:
Widget::Widget(QWidget *parent)
    : QWidget(parent),
      ui(new Ui::Widget)
{
    ui->setupUi(this); // 初始化用户界面
}

这里通过构造函数初始化ui,并调用setupUi()来加载UI文件(由Qt Designer设计并转换成代码的用户界面布局)。这样,ui对象就包含了所有界面上的控件及其布局信息,程序员可以通过ui成员变量访问和操作这些控件。

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;
}


让我们聚焦于关键点:

  1. 构造函数

    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
    }
    
    • 关键点: 构造函数初始化了一个继承自QWidget的新Widget对象,同时创建了一个新的Ui::Widget实例。
    • 设计用户界面: Ui::Widget是由Qt Designer工具自动生成的,它包含了界面上所有控件的布局和属性信息。
    • 设置界面: ui->setupUi(this)是核心步骤,它将预设计的界面布局和控件绑定到当前Widget对象上,实现了图形界面的实际构建。
  2. 析构函数

    Widget::~Widget()
    {
        delete ui;
    }
    
    • 关键点: 析构函数在Widget对象生命周期结束时清理资源。
    • 内存管理: 使用delete ui;来释放之前在构造函数中动态分配给成员变量ui的内存空间,遵循C++中“谁创建谁释放”的原则,防止内存泄漏。

同时注意一下:ui->setupUi(this);这一行代码与.ui文件(如widget.ui)有直接且密切的关系。
在这里插入图片描述

在Qt开发环境中,通常会使用Qt Designer工具来设计应用程序的图形用户界面(GUI)。这个工具生成的界面布局被保存在一个.ui文件中,该文件包含了窗口、按钮、标签等各种控件以及它们之间的关系、布局等信息。
当我们在C++代码中通过Ui::Widget类(通常由Qt uic工具从.ui文件自动生成对应的ui_widget.h头文件)创建一个对象,并调用其setupUi()成员函数时,实际上是将.ui文件中定义的界面布局加载到当前的QWidget子类实例(在这个例子中是Widget类的对象)上。
所以,ui->setupUi(this);的作用就是根据.ui文件中的设计将用户界面的所有元素和布局配置应用到this所指的那个Widget实例中,实现图形界面的设计与实际C++逻辑的连接。

widget.ui

双击这个文件,我们就会进入一个图形化的编辑器,就是我们之前讲的QT Desinger:
在这里插入图片描述在这里插入图片描述
如果我们点击一下左侧栏的编辑选项,就会看到这个ui文件本来的原貌:
在这里插入图片描述

.pro项目工程文件

我们还要看一下左上方的以.pro结尾的项目工程文件:
在这里插入图片描述

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

它是Qt Creator IDE用于构建项目时的项目配置文件。.pro文件用于指定项目所需的模块、编译选项、源文件、头文件、UI文件以及其他构建相关的信息。以下是逐行解释:

  • QT += core gui: 指定该项目需要用到Qt的核心库(core)和图形用户界面库(gui)。
  • greaterThan(QT_MAJOR_VERSION, 4): QT += widgets: 如果Qt版本大于4,则添加widgets模块。这是因为Qt5开始引入了新的Widgets模块,而在Qt4中,widgets功能包含在gui模块中。
  • CONFIG += c++11: 启用C++11标准编译器特性支持。
  • DEFINES += QT_DEPRECATED_WARNINGS: 定义宏以便在使用Qt已弃用的API时产生编译警告。
  • 下面注释部分提到,可以进一步定义QT_DISABLE_DEPRECATED_BEFORE来阻止使用特定Qt版本之前弃用的API编译通过。
  • SOURCES += main.cpp widget.cpp: 指定项目中的源代码文件,这里包括主程序入口main.cpp和自定义Widget类的实现widget.cpp
  • HEADERS += widget.h: 指定项目中的头文件,这里包含自定义Widget类的声明widget.h
  • FORMS += widget.ui: 指定项目中使用Qt Designer设计的UI文件,这里是widget.ui,它会被uic工具转换成C++代码并整合进项目。

这些其实都是在我们创建项目时,QT自动帮我们创建好的。一般来说,初学者一般都是不用改这些文件的。

还有就是如果我们运行了一次程序,会自动出现一个文件:
在这里插入图片描述这个就是qmake的build(有点像cmake),里面的文件都有这些:
在这里插入图片描述这些都是qmake帮我们构建好的,其实跟cmake的效果差不多。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32的DMA

DMA(Direct memory access)直接存储器存取,用来提供在外设和存储器之间或者存储 器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;数据可以通过DMA快速地移动&#xff0c;这就节 省了CPU的资源来做其他操作。 STM32有两个DMA控制器共12个通道(DMA1有7个通道…

基于YOLOV8+Pyqt5光伏太阳能电池板目标检测系统

1、YOLOV8算法 YOLOv8 是当前效果较好的目标检测 算法&#xff0c;它的核心网络来源于 DarkNet-53&#xff0c;该网络初次在 YOLOv3[11] 中被引入&#xff0c;并深受 ResNet[12] 的影响。DarkNet-53 使用了残差机制&#xff0c;并连续添加了卷积模块来加强其功能性。 这 53 层…

Cortex‐M3/M4/M7内核的操作模式和特权等级介绍

0 前言 如果我们是基于MCU的裸机编程&#xff0c;是不需要关心内核的操作模式和特权等级的。如果是进行RTOS的开发编程&#xff0c;我们就要必要了解一下Cortex‐M3/M4/M7内核的操作模式和特权等级&#xff0c;这在RTOS的线程切换等场合会使用到。 1 Cortex‐M3/M4/M7内核的操…

栈————顺序栈和链式栈

目录 栈 顺序栈 1、初始化顺序栈 2、判栈空 3、进栈 4、出栈 5、读栈顶元素 6、遍历 链式栈 1、初始化链式栈 2、断链式栈是否为空判 3、入栈(插入) ​编辑​编辑 4、出栈(删除) 5、读取栈顶元素 6、输出链式栈中各个节点的值&#xff08;遍历&#xff09; 栈 …

Golang | Leetcode Golang题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; func addTwoNumbers(l1, l2 *ListNode) (head *ListNode) {var tail *ListNodecarry : 0for l1 ! nil || l2 ! nil {n1, n2 : 0, 0if l1 ! nil {n1 l1.Vall1 l1.Next}if l2 ! nil {n2 l2.Vall2 l2.Next}sum : n1 n2 carrysum, carry …

(React组件基础)前端八股文Day6

一 类组件与函数组件有什么异同 在React中&#xff0c;类组件和函数组件是创建组件的两种主要方式。随着React的发展&#xff0c;尤其是自Hooks在React 16.8中引入以来&#xff0c;函数组件的功能变得更加强大&#xff0c;使得它们能够更加方便地与类组件相竞争。下面是类组件…

MySQL数据库(高级)

文章目录 1.MySQL约束1.主键细节说明演示复合主键 2.not null&#xff08;非空&#xff09;3.unique&#xff08;唯一&#xff09;细节说明演示 4.外键外键示意图使用细节演示 5.check演示 6.创建表练习答案 7.自增长演示细节 2.索引1.索引机制2.创建索引演示细节 3.删除索引4.…

【苹果MAC】苹果电脑 LOGI罗技鼠标设置左右切换全屏页面快捷键

首先键盘设置->键盘快捷键 调度中心 设置 f1 f2 为移动一个空间&#xff08;就可以快捷移动了&#xff09; 想要鼠标直接控制&#xff0c;就需要下载官方驱动&#xff0c;来设置按键快捷键&#xff0c;触发 F1 F2 安装 LOGI OPTIONS Logi Options 是一款功能强大且便于使用…

Yarn的安装和使用(2):使用及问题解决

Yarn是JavaScript的依赖管理工具&#xff0c;它与npm类似&#xff0c;但提供了一些额外的性能优化和一致性保证。 Yarn的使用&#xff1a; 初始化项目&#xff1a; yarn init 此命令会引导您创建一个新的package.json文件&#xff0c;用于记录项目的元信息和依赖。 添加依赖&…

38.HarmonyOS鸿蒙系统 App(ArkUI)堆叠布局结合弹性布局

层叠布局用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&#xff0c;容器中的子元素&#xff08;子组件&#xff09;依次入栈&#xff0c;后一个子元素覆盖前一个子元素&#xff0c;子元素…

神经网络与深度学习(一)误差反传BP算法

误差反传BP算法 1多层感知机1.1XOR问题1.2多层感知机 2.BP算法2.1简述2.2详解2.2.1输入输出模型2.2.2梯度下降算法迭代2.2.3前向传播在输出端计算误差2.2.4误差反传--输出层2.2.5误差反传--隐含层2.2.6误差反传--总结 1多层感知机 1.1XOR问题 线性不可分问题&#xff1a; 无法…

正弦实时数据库(SinRTDB)的使用(10)-数据文件的无损压缩

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

LabVIEW双通道太阳射电频谱观测系统

LabVIEW双通道太阳射电频谱观测系统 开发了一个基于LabVIEW平台开发的双通道高速太阳射电频谱观测系统。该系统实时监测太阳射电爆发&#xff0c;具有随机性、持续时间短、变化快等特点。通过高速信号采集卡实现1.5 GS/s的信号采集&#xff0c;时间分辨率可达4ms&#xff0c;频…

jvm类加载机制概述

、什么是jvm的类加载机制 类加载机制是指我们将类的字节码文件所包含的数据读入内存&#xff0c;同时我们会生成数据的访问入口的一种 特殊机制。那么我们可以得知&#xff0c;类加载的最终产品是数据访问入口。 加载类文件&#xff08;即.class文件&#xff09;的方式有以下几…

ChatGPT chrome扩展下载与安装

官方下载地址 https://chromewebstore.google.com/detail/lpbhmlbicmgjpacbofijdfpcplfhakeo 截图 安装 离线安装 下载地址 https://static.xutongbao.top/app/chatgpt-chrome-crx-v0.0.7.zip 打开链接 chrome://extensions/ 人工智能学习网站 https://chat.xutongbao.to…

获取电商数据的几种方法分享

在数字化时代&#xff0c;电商数据已经成为企业决策的重要依据。无论是市场趋势的洞察、用户行为的分析&#xff0c;还是产品优化和营销策略的制定&#xff0c;都离不开电商数据的支持。本文将分享几种获取电商数据的有效方法&#xff0c;力求在干货满满的同时&#xff0c;也不…

精通【PHP循环结构知识】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

怎么打包出release.aar包

第一种 选择build variant 更改成release 第二钟 在gradle中选择相应任务来编译 选择assemble release如果没有这个选项&#xff0c;可能是你没有开启那个Task 收集的选项

Acrobat Pro DC 2023 for Mac PDF编辑管理软件

Acrobat Pro DC 2023 for Mac是一款功能强大的PDF编辑和管理软件&#xff0c;旨在帮助用户轻松处理PDF文件。它提供了丰富的工具和功能&#xff0c;使用户可以创建、编辑、转换和注释PDF文件&#xff0c;以及填写和签署PDF表单。 软件下载&#xff1a;Acrobat Pro DC 2023 for …

2024年泰迪杯数据挖掘B题详细思路代码文章教程

目前b题已全部更新包含详细的代码模型和文章&#xff0c;本文也给出了结果展示和使用模型说明。 同时文章最下方包含详细的视频教学获取方式&#xff0c;手把手保姆级&#xff0c;模型高精度&#xff0c;结果有保障&#xff01; 分析&#xff1a; 本题待解决问题 目标&#…