112.Qt中的窗口类

        我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类, 下拉菜单中有三个选项, 分别为: QMainWindow、QDialog、QWidget如下图:

常用的窗口类有3个
在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的其中一个。

一、 QWidget类

QWidget是Qt框架中所有用户界面对象的基类。它提供了一种用于创建窗口和其他可视化元素的基础机制。以下是QWidget类的一些关键特性和常用方法:

特性:

  1. 父子关系: QWidget支持层次结构,可以通过设置父对象来组织窗口和控件。

  2. 绘制和事件处理: QWidget有一些虚拟函数,比如paintEvent,可以被子类重写以实现自定义的绘制和事件处理逻辑。

  3. 布局管理: QWidget可以包含布局管理器,用于自动管理子控件的位置和大小。

  4. 样式表: 通过使用样式表(类似于CSS),可以定制QWidget及其子类的外观。

  5. 焦点: QWidget支持焦点管理,可以接收焦点并处理键盘事件。

  6. 大小和位置: QWidget可以设置大小和位置,并且有一些方法用于获取和设置这些属性。

二、QDialog类 

QDialog类是Qt框架中用于创建对话框的基类。对话框是一个独立的窗口,通常用于执行特定任务、显示信息、或者收集用户输入。QDialog提供了一些默认的对话框行为,同时也允许开发者通过继承并定制其行为。

以下是QDialog类的一些特性和常用方法:

特性:

  1. 按钮框架(Button Box): QDialog通常包含一个按钮框架,用于容纳标准的对话框按钮(如确定、取消、应用等),这可以通过QDialogButtonBox来实现。

  2. 返回结果: 对话框可以返回一个结果,例如用户的选择或输入,通过调用QDialog::exec()来模态显示对话框,并根据用户的操作返回相应的结果。

  3. 大小调整: 对话框可以自动根据内容调整大小,也可以手动设置大小。

  4. 模态和非模态: 对话框可以以模态或非模态的方式显示。模态对话框阻止与应用程序的其他部分的交互,直到对话框关闭。

三、QMainWindow类 

QMainWindow类是Qt框架中用于创建主窗口的基类。主窗口通常包含菜单栏、工具栏、状态栏等,是应用程序的主界面。QMainWindow提供了一些默认的主窗口布局和行为,同时也允许开发者通过继承和定制来创建自定义的主窗口。

以下是QMainWindow类的一些特性和常用方法:

特性:

  1. 菜单栏、工具栏和状态栏: QMainWindow包含了方便的方法来设置和管理菜单栏、工具栏和状态栏。可以使用menuBar()toolBar()statusBar()方法来获取对应的对象。

  2. 中心窗口区域: QMainWindow提供了一个中心区域,可以通过setCentralWidget()方法设置为主窗口的中心显示区域。

  3. Dock窗口: 可以通过QDockWidget类将可停靠的窗口添加到主窗口的周围,提供更灵活的布局。

  4. 布局管理: QMainWindow支持布局管理器,可以通过setCentralWidget()setDockWidgetArea()等方法来配置窗口的布局。

  5. 状态保存和还原: QMainWindow能够保存和还原窗口的状态,包括窗口的位置、大小、布局等信息。

  6. 文档/模式视图: 支持文档/模式视图架构,可以在主窗口内管理多个文档或视图。

示例代码:mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testwidge.h"
#include "testdialog.h"
#include "QPushButton"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建第一个按钮,让这个按钮作为当前创建的子控件QPushButton* btnA=new QPushButton(this);//移动按钮位置btnA->move(10,10);//给按钮设置固定大小btnA->setFixedSize(200,200);//创建第二个按钮,让这个按钮作为当前创建的子控件QPushButton* btnB=new QPushButton(btnA);//移动按钮位置btnB->move(10,10);//给按钮设置固定大小btnB->setFixedSize(100,100);//创建第三个按钮,让这个按钮作为当前创建的子控件QPushButton* btnC=new QPushButton(btnB);//移动按钮位置btnC->move(10,10);//给按钮设置固定大小btnC->setFixedSize(50,50);//创建窗口对象,没有给w对象指定父对象,这个窗口是一个独立窗口//要显示这个独立窗口必须要进行show()操作TestWidge* w=new TestWidge;//显示当前窗口w->show();
/*//一般在qt的构造函数中进行初始化操作(窗口,数据,...)//显示当前窗口的时候,显示另外一个窗口TestWidget
#if 0//创建窗口对象,没有给w对象指定父对象,这个窗口是一个独立窗口//要显示这个独立窗口必须要进行show()操作TestWidge* w=new TestWidge;//显示当前窗口w->show();
#else//创建窗口对象,没有给w对象指定父对象//explicit TestWidge(QWidget *parent = nullptr);//如果创建一个窗口对象的时候给其指定了父对象,这个窗口就不是一个独立窗口//这样的话当前父窗口显示的时候,子窗口就一并被显示出来了//这时候子窗口是没有边框的TestWidge* w=new TestWidge(this);
#endif#if 0//创建对话框窗口TestDialog *dlg=new TestDialog(this);//非模态dlg->show();
#else//创建对话框窗口TestDialog *dlg=new TestDialog(this);//模态,需调用这个函数exec(),阻塞程序的执行dlg->exec();
#endif
*/}MainWindow::~MainWindow()
{delete ui;
}

 

四、两个窗口类

在Qt中,有两个常见的窗口类型:Form窗口和MainWindow窗口。

Form窗口(QWidget):

QWidget是Qt中所有可视化组件的基类,它可以用于创建简单的窗口或者作为其他窗口组件的基础。Form窗口通常不包含菜单栏、工具栏、状态栏等主窗口元素,而是被用于容纳其他控件。

特性:

  • 不包含默认的菜单栏、工具栏或状态栏。
  • 适合用于创建自定义的对话框或简单的窗口。
  • 使用QWidget可以自由设计窗口的外观和布局。

MainWindow窗口(QMainWindow):

QMainWindow是用于创建主窗口的类,它包含了许多常见的主窗口元素,如菜单栏、工具栏、状态栏等。MainWindow窗口通常是应用程序的主界面,用于承载整个应用程序的主要功能。

特性:

  • 包含默认的菜单栏、工具栏和状态栏。
  • 适合用于创建典型的桌面应用程序的主窗口。
  • 支持文档/模式视图结构,可以管理多个文档或视图。

在实际的应用程序中,可以根据需要选择使用QWidget还是QMainWindow。如果你需要创建一个简单的窗口或者对话框,可能选择使用QWidget。而如果你的应用程序需要具备主窗口的标准结构,包括菜单、工具栏和状态栏等,那么使用QMainWindow更为合适。

 五、坐标体系

在Qt中,坐标体系(Coordinate System)是用来定位和描述界面上元素位置的一种方式。Qt使用的坐标体系是二维平面上的笛卡尔坐标系,其中原点通常位于左上角,x轴向右延伸,y轴向下延伸。

在Qt中,窗口的相对坐标通常指的是相对于其父窗口或者相对于屏幕的坐标。这是在布局和界面设计中经常会遇到的概念,尤其是当一个窗口嵌套在另一个窗口中时。

//创建第一个按钮,让这个按钮作为当前创建的子控件QPushButton* btnA=new QPushButton(this);//移动按钮位置btnA->move(10,10);//给按钮设置固定大小btnA->setFixedSize(200,200);//创建第二个按钮,让这个按钮作为当前创建的子控件QPushButton* btnB=new QPushButton(btnA);//移动按钮位置btnB->move(10,10);//给按钮设置固定大小btnB->setFixedSize(100,100);//创建第三个按钮,让这个按钮作为当前创建的子控件QPushButton* btnC=new QPushButton(btnB);//移动按钮位置btnC->move(10,10);//给按钮设置固定大小btnC->setFixedSize(50,50);

这是一个使用Qt框架创建按钮的示例代码,其中按钮之间形成了父子关系。

  1. 创建第一个按钮 btnA

    • QPushButton* btnA = new QPushButton(this); 创建一个按钮,并将其父对象设置为当前窗口(this)。
    • btnA->move(10, 10); 将按钮的位置移动到 (10, 10)。
    • btnA->setFixedSize(200, 200); 设置按钮的固定大小为 200x200 像素。
  2. 创建第二个按钮 btnB

    • QPushButton* btnB = new QPushButton(btnA); 创建一个按钮,并将其父对象设置为第一个按钮 btnA。这样,btnB 成为了 btnA 的子控件。
    • btnB->move(10, 10); 将按钮 btnB 相对于其父对象 btnA 的位置移动到 (10, 10)。
    • btnB->setFixedSize(100, 100); 设置按钮 btnB 的固定大小为 100x100 像素。
  3. 创建第三个按钮 btnC

    • QPushButton* btnC = new QPushButton(btnB); 创建一个按钮,并将其父对象设置为第二个按钮 btnB。这样,btnC 成为了 btnB 的子控件,同时也是 btnA 的孙子控件。
    • btnC->move(10, 10); 将按钮 btnC 相对于其父对象 btnB 的位置移动到 (10, 10)。
    • btnC->setFixedSize(50, 50); 设置按钮 btnC 的固定大小为 50x50 像素。

这样,创建了一个包含三个按钮的父子关系层次结构。按钮 btnC 是按钮 btnB 的子控件,同时也是按钮 btnA 的孙子控件。控件之间的父子关系在布局、显示和事件处理等方面都具有重要意义。

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

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

相关文章

软路由之爱快基于L2TP 实现

申明:本文仅针对国内SSTP,适用于国内的游戏加速,禁止一切利用该技术的翻墙行为。 相信很多接触过爱快的人都需要连接L2TP或PPTP,本文主要介绍通过爱快iKuai的L2TP 来实现异地组网。 一、准备工作 1、爱快 v3.x 2个(免…

Redis不同环境缓存同一条数据,数据内部值不同

背景 现实中,本地环境(dev)和开发环境(feature)会共同使用相同的中间件(本篇拿Redis举例),对于不同环境中的,图片、视频、语音等资源类型的预览地址url,需要配…

预训练中文GPT2(包括重新训练tokenizer)

训练数据 1.json后缀的文件 2.数据是json line格式,一行一条json 3. json结构如下 {"content": "①北京和上海户籍的游客可获得韩国多次签证;②“整容客”可以不经由韩国使领馆、直接在网上申请签证;③中泰免签的实施日期…

C# HttpClient Get Post简单封装

文章目录 前言封装好的代码测试接口测试代码 前言 微软官方有Get和Post请求&#xff0c;我把他简单化处理一下 封装好的代码 public class MyHttpHelper{private string baseUrl;/// <summary>/// 基础Api/// </summary>public string BaseUrl{get{return baseUr…

docker 部署项目的操作文档,安装nginx

目录 1 部署环境检查2 相关知识点2.1 docker默认镜像存放地址2.2 docker 的镜像都是tar 包&#xff1f;2.3 Docker-compose 是直接使用镜像创建容器&#xff1f;2.4 Docker Compose down 就是将容器删除&#xff1f;2.5 删除&#xff0c;会删除挂载嘛2.6 DockerFile 和 docker …

[SAP ABAP] 循环处理

1. WHILE循环 语法格式 WHILE <logical expression> <statement block>. ENDWHILE. 只要给定的逻辑表达式的结果为True&#xff0c;WHILE循环语句就会重复执行目标语句&#xff0c;直至逻辑表达式结果变为False&#xff0c;循环才会终止 例子 输出结果如下所示…

wxWidgets实战:使用mpWindow绘制阻抗曲线

选择模型时&#xff0c;需要查看model的谐振频率&#xff0c;因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示&#xff1a; mpWindow 左侧使用mpWindow&#xff0c;右侧使用什么&#xff1f; wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…

【conda】pip安装报错,网络延时问题解决记录(亲测有效)

【conda】pip安装报错&#xff0c;网络延时问题解决记录 1. pip install 报错如下所示2. 解决方案&#xff1a; 1. pip install 报错如下所示 pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out.…

Logstash:迁移数据到 Elasticsearch

在生产环境中&#xff0c;不使用 Apache Kafka 等流平台进行数据迁移并不是一个好的做法。 在这篇文章中&#xff0c;我们将详细探讨 Apache Kafka 和 Logstash 的关系。 但首先让我们简单了解一下 Apache Kafka 的含义。 Apache Kafka 是分布式流平台&#xff0c;擅长实时数据…

10个提高 Python Web 开发效率的VS Code插件

VS Code具有灵活、便捷和丰富的可用插件库&#xff0c;是Web开发人员中非常受欢迎的代码编辑器。 本文介绍10个VS Code插件&#xff0c;它们可以提高你作为Web开发人员的工作效率。 1. Live Preview Live Preview插件支持在VS Code的小型浏览器中查看网站。因此&#xff0c;无…

【Python】Sigmoid和Hard Sigmoid激活函数对比总结及示例

Sigmoid和Hard Sigmoid是两种常用的激活函数&#xff0c;它们在神经网络中起到非线性变换的作用。以下是它们之间的对比和优缺点总结&#xff1a; Sigmoid激活函数&#xff1a; 优点&#xff1a; 输出范围是0到1之间&#xff0c;可以用于二分类问题。函数形状相对平滑&#…

【Oracle】Oracle的安装与连接

Oracle基础 一、ORACLE 简介 1、oracle概述 ORACLE 数据库系统以分布式数据库为核心的一组软件产品 支持多用户、大事务量的事务处理数据安全性和完整性控制支持分布式数据处理可移植性强&#xff0c;跨平台 2、oracle体系架构 1&#xff09;数据库 Oracle 数据库是数据…