[QT编程系列-3]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:HelloWorld、常见控件、对象树原理

news2025/2/25 2:59:58

目录

2. QT程序的运行框架

2.1 Hello World程序框架

2.2 QT Designer初识

2.3 用QT Designer设计用户登录界


2. QT程序的运行框架

2.1 Hello World程序框架

上述示例代码中,首先根据应用程序的需求使用 QCoreApplication 或 QApplication 定义 app 对象。如果你的应用程序需要图形界面,则使用 QApplication,否则使用 QCoreApplication。然后,你可以在 main() 函数中进行你的应用程序逻辑编写。最后,使用 app.exec() 启动应用程序的事件循环,等待事件的发生和处理,直到应用程序退出。

值得注意的是,main() 函数的参数 argc 和 argv 用于接收命令行参数,它们会传递给 QApplication 或 QCoreApplication 对象进行处理。

总而言之,Qt中的主函数 main() 和普通C++程序相比并没有太大的区别,但使用Qt提供的宏可以方便地生成主函数,并且初始化和启动应用程序的事件循环。

Qt程序框架是指一种组织和结构化Qt应用程序的模式或结构

尽管Qt允许开发者自由组织和设计自己的应用程序结构,但通常会有一些常用的框架和设计模式用于构建Qt应用程序。

以下是一种常用的Qt程序框架,称为MVC(模型-视图-控制器)模式:

  1. 模型(Model):模型表示数据和业务逻辑。在Qt中,模型可以是自定义的C++类或Qt提供的数据模型类(如QAbstractItemModel)。模型负责管理数据,提供访问和操作数据的接口,并通过信号和槽机制通知视图更新。算法处理就是模型中核心部件。

  2. 视图(View):视图负责展示数据给用户。在Qt中,视图可以是QWidget、QML视图或自定义的视图组件。视图接收模型发出的信号,更新显示和布局,以实现数据的可视化呈现

  3. 控制器(Controller):控制器充当模型和视图之间的协调者。它捕获用户的输入(如鼠标点击、键盘事件),解释用户的意图,并对模型进行相应的更新操作。在Qt中,控制器可以是信号和槽的连接,也可以是自定义的事件处理函数或命令模式的实现。QT程序框架是控制器的核心部件。

这种MVC模式的框架将数据、用户界面业务逻辑分离,提供了一种清晰的组织结构,使代码更易于维护和扩展。开发者可以通过将数据和业务逻辑集中在模型中,将用户界面的展示与交互分离到视图和控制器中,从而实现更好的代码复用可测试性

除了MVC模式,Qt还支持其他常见的设计模式,如观察者模式(用于处理信号和槽)、单例模式(用于全局的共享对象)和工厂模式(用于创建对象)等。开发者可以根据自己的需求选择最合适的设计模式,并结合Qt框架提供的工具和功能,构建出高效、可扩展和易于维护的Qt应用程序。

2.2 QT Designer初识

 Qt Designer 是一个可视化的用户界面设计工具,它是Qt开发套件的一部分。Qt Designer 允许开发者通过简单的拖拽和放置操作,在可视化界面中创建和编辑Qt应用程序的用户界面。

主要特性:

  1. 可视化设计:Qt Designer 提供了一个直观的可视化界面,开发者可以通过拖拽、放置和调整控件来设计程序界面。无需手写代码,开发者可以轻松地布局和设计应用程序的界面。

  2. 快速生成代码:Qt Designer 可以生成与界面设计相对应的代码,包括UI文件和相关的头文件。这些文件可以被应用程序的其他部分使用,通过连接信号和槽函数进行交互。

  3. 支持多种控件和布局:Qt Designer 提供了丰富的控件库和布局管理器,可以满足各种应用程序的界面需求,包括按钮、文本框、标签、列表框、表格、菜单栏等常见控件,以及垂直布局、水平布局、表格布局等常见布局管理器。

  4. 属性编辑器:Qt Designer 提供了一个属性编辑器,可让开发者对控件的属性进行自定义设置,如文本、颜色、大小、对齐等。开发者可以直接在属性编辑器中修改属性,无需手动编写代码。

  5. 预览和测试:Qt Designer 允许开发者实时预览设计的界面,以便在设计过程中查看界面的外观和布局效果。此外,开发者还可以将设计的界面与代码进行集成和测试,以确保界面与应用程序的其他部分正常工作。

使用 Qt Designer,开发者可以更快速地创建复杂的Qt应用程序界面,提高开发效率。设计完成后,Qt Designer 生成的UI文件可以与Qt项目进行集成,并通过Qt Creator等开发环境来进一步开发和调试应用程序。

 

 QWidget 和 QWindows 是 Qt 框架中两个不同的类,分别用于创建和管理窗口

  1. QWidget:
    QWidget 是 Qt 框架的基类,用于创建可视化的窗口部件。它提供了一系列的功能和方法,用于处理窗口的绘制、布局、事件处理等操作。QWidget 是一个通用的窗口类,可以用于创建各种类型的窗口,包括顶级窗口、对话框、部件容器等。

可以通过 QWidget 的派生类 QWindowsQFrame、QGroupBox、QDialog 、QLabel等来创建特定类型的窗口。QWidget 可以包含其他 QWidget 子类的实例,从而形成多层的窗口层次结构。

  1. QWindows:
    QWindows 是 Qt 框架中的一个特定平台的类,用于处理 Windows 操作系统上的窗口相关操作。它是 QWidget 的子类,继承了 QWidget 的功能,并提供(新增)了与 Windows 平台相关的操作,如窗口的创建、最大化、最小化、标题栏设置等。

QWindows 类是在 Qt 框架的 winextras 模块中定义的,用于提供更便捷的 Windows 平台特定的窗口操作。

总结:
QWidget 是 Qt 框架中用于创建可视化窗口的基类,它是一个通用的窗口部件,可以创建各种类型的窗口。而 QWindows 则是 QWidget 的子类,是特定于 Windows 平台的类,提供了在 Windows 上操作窗口的功能。

在大多数情况下,开发者可以直接使用 QWidget 来创建和管理窗口,无论是在 Windows 还是其他平台上。只有在涉及到特定于 Windows 平台的窗口操作时,才需要使用 QWindows 类。

 

 

 2.3 用QT Designer设计用户登录界

 

 

 

在 Qt 框架中,对象树是一种用于管理对象生命周期层次关系机制。每个 Qt 对象都可以有一个父对象,并且可以添加子对象,形成对象树的结构。

这种对象树结构对于组织和管理对象非常有用,特别是在界面开发中。

以下是一些关于 Qt 对象树的重要概念和注意事项:

  1. 父子关系:通过 setParent() 方法可以设置一个对象的父对象。当父对象被销毁时,它会自动销毁它的所有子对象。子对象的析构函数会在父对象的析构函数中自动调用(这是对象树的重要的特征)

  2. 所有者对象:通过设置父对象,父对象成为子对象的所有者所有者对象负责管理子对象的内存,在所有者对象被销毁时,会自动销毁它的所有子对象。

  3. 对象树层次关系:通过设置父子关系,可以形成对象树的层次结构。在对象树中,可以通过递归或逐级遍历的方式访问对象的子对象。

  4. 窗口部件树:在图形界面开发中,窗口部件(QWidget)也可以形成对象树结构,也称为窗口部件树。窗口部件树的顶层窗口部件称为主窗口

  5. 使用对象树的优点:

    • 简化内存管理:通过对象树,父对象负责管理子对象的内存,减少手动释放内存的工作。
    • 组织对象关系:通过对象树的层次关系,可以更好地组织和管理对象之间的关系。
    • 简化资源回收:当一个对象从对象树中移除时,它的子对象会自动释放,从而简化资源的回收。

注意事项:

  • 将对象设置为其他对象的子对象时,需要确保父对象在子对象之前创建,并且在父对象被销毁之后,子对象不会被使用。
  • 使用 QObject 的对象树相关功能时,需要注意循环引用的问题,确保没有形成无法释放的对象循环。

总结:Qt 的对象树机制通过设置父子关系,用于管理对象的生命周期和层次关系。通过正确设置对象树,可以简化内存管理,并组织和管理对象之间的关系。窗口部件也可以形成窗口部件树的结构。开发者需要注意对象树的创建和销毁顺序,以及避免循环引用的问题。

 在Qt中,界面描述文件是一种用于描述用户界面的XML文件,它以 .ui 扩展名标识

界面描述文件包含了窗口部件的布局、属性和事件等信息,可以通过Qt提供的工具转换为可执行的C++代码(类或对象,如下图所示),界面描述文件用于创建和初始化用户界面。//初始界面通过界面描述文件来描述,后续的界面内容的更新,可以通过槽函数来更新。

界面描述文件通常是使用Qt Designer工具创建的,Qt Designer是一个可视化的界面设计工具,可以通过拖拽和放置控件来创建和编辑用户界面。在Qt Designer中创建的界面可以保存为界面描述文件,然后在应用程序中加载并使用。

界面描述文件是跨平台的,可以在不同的操作系统上使用。

在项目构建过程中,界面描述文件会被编译为C++代码,并与应用程序的其他部分进行集成和编译

以下是一个示例的界面描述文件的代码:

 

 

在Qt中,常规对象树(General Object Tree)是指在Qt对象模型中用于管理对象关系和内存管理的层次结构。Qt中的几乎所有对象都可以参与到常规对象树中。

常规对象树具有以下特点:

  1. 对象之间的层级结构:通过设置父子关系,对象可以形成层级结构。一个对象可以拥有多个子对象,同时作为另一个对象的子对象。这种层级结构可以通过 setParent() 方法来建立。

  2. 对象的生命周期管理:当一个对象成为另一个对象的子对象时,父对象会负责管理子对象的内存。当父对象被销毁时,它会自动销毁其所有的子对象,无需手动释放内存。这种方式极大地简化了内存管理的工作。

  3. 对象间的通信与协作:通过信号与槽机制,对象可以在常规对象树中进行通信与协作一个对象可以发送信号,而其他对象可以连接并响应这些信号,以实现对象之间的数据传递和协同工作。

  4. 应用程序结构的组织:通过常规对象树,可以以模块化和分层的方式组织应用程序的结构。不同的功能模块可以作为对象树的节点或叶子节点存在,从而实现代码的复用和分工开发。

通过常规对象树,Qt提供了一种结构化和管理对象的方式。它使得开发者能够更容易地管理对象之间的关系、控制对象的生命周期,以及实现对象之间的通信和协作。

需要注意的是,在使用常规对象树时,需要小心避免创建循环引用的情况,以免导致内存泄漏。此外,父对象的生命周期必须比子对象更长,否则可能导致子对象在其父对象被释放后引用已释放的内存而导致程序崩溃。

在 Qt 中,逻辑对象树(Logical Object Tree)是一种用于管理应用程序的逻辑结构的对象层次结构。它基于Qt 的对象模型,用于组织和管理应用程序的逻辑组件,实现模块化和分层的设计。

逻辑对象树与常规对象树(Qt 对象树)的区别在于它更关注应用程序的组织和逻辑结构。逻辑对象树中的对象通常代表应用程序的不同功能模块、业务逻辑、数据结构等。

以下是一些关于逻辑对象树的重要概念和注意事项:

  1. 模块化设计:逻辑对象树可以用于实现模块化的应用程序设计。不同的功能模块可以作为对象树的节点或叶子节点,彼此之间相互独立,并通过逻辑对象树建立联系和通信。

  2. 逻辑关系建立:通过父子对象的关系,可以在逻辑对象树中建立对象之间的关系。父对象可以管理子对象的生命周期,并提供接口和方法供子对象使用。

  3. 信号与槽连接:逻辑对象树中的对象可以通过信号与槽机制进行通信和交互。一个对象可以发送信号,而其他对象可以响应并执行相应的槽函数,实现对象之间的协同工作和数据传递。

  4. 数据共享与状态管理:逻辑对象树可以用于共享数据和管理应用程序的状态。一些对象可以被多个其他对象引用,共享数据的读写操作可以在逻辑对象树中进行协调和控制。

逻辑对象树的使用可以帮助开发者在应用程序中结构化和组织代码,提高代码的可读性和可维护性。通过将应用程序划分为模块化的逻辑组件,可以实现代码的复用和分工开发。

需要注意的是,逻辑对象树的设计和构建取决于具体的应用程序和设计需求。开发者可以根据自己的应用场景,合理利用逻辑对象树来组织和管理应用程序中的逻辑结构。

 

 在 Qt 中,常规对象树的构建过程一般分为以下几个步骤:

  1. 创建对象:首先,需要创建 Qt 对象。可以使用相应类的构造函数来实例化对象,例如使用 new 关键字或者 QSharedPointer 等方式创建对象。创建的对象将成为常规对象树中的一个节点。

  2. 设置父子关系:在创建对象后,可以使用 setParent() 方法将其设置为另一个对象的子对象。这样,对象之间就会建立起父子关系,从而形成了常规对象树的结构。也可以在对象创建时通过构造函数的参数直接指定父对象。

  3. 添加到对象树:将对象添加到对象树中,可以使用 QGraphicsScene(图形场景)等特定的容器类,或者在自定义的类中使用成员变量进行管理。对象添加到对象树后,会自动进行父子关系的管理和内存回收。

  4. 设置属性和信号槽:根据对象的功能和需求,可以设置对象的属性和连接信号与槽。属性的设置可以使用相应的 setter 方法进行,而信号与槽的连接则使用 connect() 函数进行。这样,对象可以在常规对象树中进行通信和协作。

  5. 释放对象:在对象不再需要时,可以手动释放对象或者让对象的父对象负责释放。当父对象被释放时,它会自动销毁其所有的子对象,无需手动释放内存。也可以使用 delete 关键字显式地删除对象。

需要注意的是,对象的创建和添加到对象树的过程可以根据具体的应用场景和设计需求进行定制和扩展。对象树的构建过程可以在代码中的不同位置进行,例如在构造函数中、槽函数中或者在特定的初始化方法中。

此外,Qt 中还提供了更复杂的对象构建方式,例如使用 Qt Designer 设计界面并生成代码来自动创建对象,并通过布局、组合和继承的方式建立对象树。

总的来说,Qt 对象树的构建过程主要包括对象的创建、设置父子关系、添加到对象树、设置属性和信号槽,以及释放对象。这个过程可以帮助开发者管理对象之间的关系、内存的管理以及实现协作和通信。

实现主窗口类的构造函数:

在主窗口类的构造函数中,需要完成主窗口的初始化工作。可以设置窗口的标题、大小、位置等属性,并创建其他界面组件(如按钮、菜单等)并添加到主窗口中

 

 

在Qt中创建UI对象的过程通常包括以下几个步骤:

  1. 使用Qt设计师(Qt Designer)或手动创建UI文件:首先,你可以使用Qt设计师创建用户界面的布局和元素,也可以手动创建一个UI文件,其中定义了界面的布局和各个组件。

  2. 使用uic工具生成头文件:将UI文件转换为C++代码。你需要使用uic工具将UI文件转换为相应的头文件,该头文件将包含UI对象的定义。

    uic input.ui -o output.h
    
  3. 添加UI对象的头文件:在你的代码中包含UI对象的头文件。

    #include "output.h"
    
  4. 创建UI对象实例:在你的代码中创建UI类的实例,通过实例化该对象,你可以访问和操作UI中的控件。

    Ui::OutputClass ui; // 创建UI类的实例
    
  5. 初始化UI对象:使用QWidget或其派生类的构造函数初始化UI对象。

    QWidget* widget = new QWidget; // 创建QWidget或其派生类的实例
    ui.setupUi(widget); // 初始化UI对象
    

    注意,这里使用了ui.setupUi(widget)来初始化UI对象,其中setupUi是Qt自动生成的一个函数,用于将UI定义应用于实际的QWidget对象。

  6. 运行UI对象:将UI对象添加到父类窗口中,或者直接显示UI对象。

    widget->show(); // 将UI对象显示出来
    

通过上述步骤,你可以创建和显示UI对象,并与其中的控件进行交互。当用户与界面进行交互时,你可以通过信号和槽机制来响应这些事件,并进行相应的处理。

Hello Wol 发发f

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[综述] Generative AI meets 3D: A Survey on Text-to-3D in AIGC Era

论文| 改文章是23年5月27日挂在arxiv上,本文重点关注4.1节Text Guided 3D Avatar Generation、4.4节Text Guided 3D Shape Transformation和第5章Discussion Text Guided 3D Avatar Generation DreamAvatar DreamAvatar: Text-and-Shape Guided 3D Hu…

k8s中网络通讯简单介绍

1 前言 Kubernetes的网络模型假定了所有的pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,Kubernetes假设这定这个网络已经存在。但是在私有云里搭建Kubernetes集群,…

CHI read trans flow

Read transactions with DMT and without snoops 对于不产生snoop的read trans,建议使用DMT功能,如下图所示: 注意点: a. SNF并不需要给HNF回响应,因为RN发送的compack可以释放HNF处记录的请求; Read transaction wi…

《Redis 核心技术与实战》课程学习笔记(七)

切片集群:数据增多了,是该加内存还是加实例? 切片集群,也叫分片集群,就是指启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。…

使用Dcoker Registry搭建私有镜像仓库

Dcoker Registry 和Harbor有什么相似和区别?各自有什么优劣,请详细介绍 Docker Registry和Harbor都是容器镜像仓库管理系统,用于存储、管理和分发Docker镜像。它们有一些相似之处,但也存在一些区别。下面是对它们的相似之处和区别…

idea导入springboot项目,下载的pom.xml文件是html格式。

一、可以看到我的pom.xml的parent标签 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0…

使用cuda报错的一次记录(CUDA error: out of memory)

原因&#xff1a; 由于batch_size设置过大导致的&#xff01;&#xff01;&#xff01;

机器学习技术(四)——特征工程与模型评估

机器学习技术&#xff08;四&#xff09;——特征工程与模型评估(1️⃣) 文章目录 机器学习技术&#xff08;四&#xff09;——特征工程与模型评估(:one:)一、特征工程1、标准化2、特征缩放3、缩放有离群值的数据4、非线性转换5、样本归一化6、特征二值化7、标称特征编码(one-…

亚马逊云科技推出的一项完全托管的生成式AI服务——Amazon Bedrock

在全球生成式AI浪潮兴起之际&#xff0c;以“智联世界&#xff0c;生成未来”为主题的2023世界人工智能大会&#xff08;WAIC 2023&#xff09;于7月6日在上海世博中心拉开帷幕。大会首日&#xff0c;亚马逊云科技携生成式AI产品Amazon Bedrock亮相大会现场&#xff0c;亚马逊云…

C语言 指针进阶(二)

目录 一.函数指针 1.1函数指针的认识 1.2函数指针的使用 二、函数指针数组 1.1函数指针的认识 1.2 函数指针数组实现计算器 三、指向函数指针数组的指针 四、回调函数 通过使用qsort函数加强对回调函数的理解 qsort排序整形 qosrt排序结构体 用冒泡排序的思想&…

Java设计模式之结构型-组合模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色分析 四、案例分析 1、基本实现 2、菜单遍历 五、总结 一、基础概念 组合模式&#xff08;Composite Pattern&#xff09;又叫部分-整体模式&#xff0c;它通过将对象组合成树形结构来表示“整体-部分”的层次关系&#xff0c…

《网络安全标准实践指南》(72页)

导读 摘要&#xff1a;为指导网络数据安全风险评估工作&#xff0c;发现数据安全隐患&#xff0c;防范数据安全风险&#xff0c;依据《中华人民共和国网络安全法》《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》等法律法规&#xff0c;参照数据安全相关国家标…

[MySQL]MySQL表的操作

[MySQL]表的操作 文章目录 [MySQL]表的操作1. 创建表2. 创建表的示例3. 查看表4. 修改表5. 删除表6. 关于表操作 1. 创建表 语法&#xff1a; CREATE TABLE [IF NOT EXISTS] table_name(field1 datatype1 [COMMENT 注释信息],field2 datatype2 [COMMENT 注释信息],field3 dat…

使用VSC从零开始写一个Vue前端

使用Visual Studio Code&#xff08;VSC&#xff09;进行Vue开发非常方便&#xff0c;下面是一些基本步骤&#xff1a; 安装Node.js&#xff1a;Vue.js是基于Node.js的&#xff0c;所以首先需要安装Node.js。你可以从Node.js官方网站&#xff08;https://nodejs.org&#xff09…

Acwing.859 Kruskal算法求最小生成树(Kruskal算法)

题目 给定一个n个点m条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出impossible。 给定一张边带权的无向图G(V,E)&#xff0c;其中V表示图中点的集合&#xff0c;E表示图中边…

Linux - CentOS 二进制安装 MySQL 8.0.31(非常实用)

一、下载 mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz 下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 具体如下图所示&#xff1a; 二、将 mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz 放入到服务器的 /usr/local &#xff08;路径可…

书法vr实景授课极大丰富了艺术家的表现语言

为了加强新形势下中华优秀传统文化教育&#xff0c;探索现代科学技术与传统文化的结合。VR公司深圳华锐视点不断创新VR虚拟现实技术在传统文化方面的体验活动&#xff0c;激发学生对传统文化的学习兴趣&#xff0c;树立民族文化自信!搭建书法授课VR虚拟场景&#xff0c;为学生创…

vue2基础用法原理

本篇转载&#xff1a;http://t.csdn.cn/KtidI 文章目录 1. vue基础知识和原理1.1 初识Vue1.2 模板语法1.3 数据绑定1.4 el与data的两种写法1.5 Vue中的MVVM1.6 数据代理1.7 事件处理1.8 键盘事件1.9 计算属性1.10 监视属性1.11 绑定样式class样式style样式 1.12 条件渲染v-ifv-…

(论文翻译)PRUNING FILTER IN FILTER《滤波器中的剪枝滤波器》

公式不清楚的地方请对照英文原文进行查看&#xff1a;原文链接 ABSTRACT 剪枝已成为现代神经网络压缩和加速的一种非常有效的技术。现有的剪枝方法可分为两大类:滤波器剪枝(FP)和权重剪枝(WP)。与WP相比&#xff0c;FP在硬件兼容性方面胜出&#xff0c;但在压缩比方面失败。为了…

海外APP外包开发第三方支付集成

APP开发过程中有收费功能时就需要集成第三方支付&#xff0c;相比传统的信用卡支付&#xff0c;第三方支付极大的提高了用户的支付便捷度&#xff0c;也推广了第三方支付的使用范围。海外有哪些支付渠道以及如何集成&#xff0c;今天和大家分享这方面的知识&#xff0c;希望对大…