112.Qt中的窗口类

news2025/1/12 8:39:29

        我们在通过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.coloradmin.cn/o/1373173.html

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

相关文章

Hive基础题-1

别看我,不看答案我也不会写 正因为不会写,所以才要每天一练 本地hive练习题 SET hive.exec.mode.local.autotrue; -- 默认 false SET hive.exec.mode.local.auto.inputbytes.max50000000; SET hive.exec.mode.local.auto.input.files.max5; -- 默认 4# …

wpf的资源路径

1、手动命名空间 xmlns:share"clr-namespace:***;assembly**" 2、资源文件 Pack URI 编译到本地程序集内的资源文件的 pack URI 使用以下授权和路径: 授权:application:///。 路径:资源文件的名称,包括其相对于本地…

构建数字化美食未来:深入了解连锁餐饮系统的技术实现

在当今数字化时代,连锁餐饮系统的设计与开发已成为餐饮业成功经营的重要一环。本文将深入研究连锁餐饮系统的技术实现,结合代码演示,为技术开发者和餐饮业者提供深刻的理解。 1. 技术选型与系统架构 在开始设计开发前,首先要考…

python 爬虫 request get或post传参

爬虫传参 import requestsurl http://www.xxx# get 或 post 传参数据 data {"pageNo": 1652,"pageSize": 10, }headers {Cookie: ,Host: ,Origin: ,Referer: ,User-Agent: , }# get 请求 # res requests.get( # url, # paramsdata, # hea…

内存问题(三)——生成内存问题案例

一、系统非堆内存溢出问题排查 以下例子出自其他人案例,拿过来是为了学习排查问题思路,与解决思路。 1.1 现象描述 运单系统每隔一段时间,内存使用和CPU报警超出阈值85%,通过监控平台可以看到非堆内存持 续增加不回收 。导致频繁…

[笔记]学习做微信小程序

学习视频:前端微信小程序开发教程 本篇文章 只对关键内容笔记,用于自用。 这里写目录标题 注册、下载、安装我的小程序ID:wxe1fbd6939d8797d8我的小游戏ID:wx8b2c3e47ac9127b7开发者工具外观代理设置 创建第一个小程序主界面5个组…

智能合约笔记

前言: 首先了解下为什么会出现智能合约,打个比方现在有两个人A和B打赌明天会不会下雨,每个人赌注100元,如果第二天下雨则A拿走200元,否则B拿走200元,这样就有一个问题,赌注要到第二天才能见效&…

[算法与数据结构][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量(单例中会使用)3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

Springboot药物不良反应智能监测系统源码

一、系统简介 ADR指的是药品不良反应,即在合格药品在正常用法用量下,出现与用药目的无关或意外的有害反应。ADR数据辨别引擎、药品ADR信号主动监测引擎、ADR处置行为分析引擎。ADR数据辨别引擎,通过主动监测患者具象临床指标,比如…

作业:通过两台linux主机配置ssh实现互相免密登陆

做题步骤: 一.开启两个Linux主机,并且用ssh连接,要能够ping通 我这里是server:192.168.81.129 client:192.168.81.130 举例 步骤: 1.安装服务软件 2.运行软件程序 3.根据自定配置提供对应的服务/etc/chr…

centOS系统yum安装和卸载mongodb

0.1 什么是mongodb? 0.2 Mongodb是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 0.3 Mongodb是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据…

WEB之HTML练习

第一题&#xff1a;用户注册界面 HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

C++游戏引擎中的坐标系

一.Direct3D四大变换 <1.世界矩阵变换: 为了模拟3D物体的旋转,缩放,平移等功能,Direct3D将静态模型的顶点坐标x,y,z经过旋转平移矩阵变换以得到新的顶点坐标x1,y1,z1 D3DXMATRIX mTrans ; D3DXMatrixTranslation (&mTrans , 5 , - 3 , 0 ); g_pd3dDevice->SetTr…

Avalonia学习(二十)-登录界面演示

今天开始继续Avalonia练习。 本节&#xff1a;演示实现登录界面 在网上看见一个博客&#xff0c;展示Avalonia实现&#xff0c;仿照GGTalk&#xff0c;我实现了一下&#xff0c;感觉是可以的。将测试的数据代码效果写下来。主要是样式使用&#xff0c;图片加载方式。 只有前…

移远通信推出两款Wi-Fi 7模组新品,赋能无线连接巅峰体验

​1月9日&#xff0c;在2024年国际消费电子产品展览会 (CES) 期间&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;正式推出支持Wi-Fi 7技术的通信模组FGE576Q和FGE573Q &#xff0c;这两款模组将以前沿的Wi-Fi性能突破无线连接边界&#xff0c;为下一…

JVM工作原理与实战(十二):打破双亲委派机制-自定义类加载器

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、打破双亲委派机制的方法 二、自定义类加载器 1.Tomcat自定义类加载器案例 2.自定义类加载器详解 3.案例解析 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执…

探索未来餐饮:构建创新连锁餐饮系统的技术之旅

随着数字化时代的发展&#xff0c;连锁餐饮系统的设计和开发不再仅仅关乎订单处理&#xff0c;更是一场充满技术创新的冒险。在本文中&#xff0c;我们将深入研究连锁餐饮系统的技术实现&#xff0c;带你探索未来餐饮业的数字化美食之旅。 1. 构建强大的后端服务 在设计连锁…

windows安装Elasticsearch后使用ik分词器报错解决办法

最近在学习Elasticsearch&#xff0c;安装完成后下载了ik分词器压缩到plugins目录下启动es报错如下&#xff1a; java.security.AccessControlException: access denied (“java.io.FilePermission” “D:…\plugins\ik-analyzer\config\IKAnalyzer.cfg.xml” “read”)咋一看…

k8s的存储卷、数据卷

容器内的目录和宿主机目录进行挂载。 容器在系统上的生命周期是短暂的。 k8s用控制器创建的pod。delete相当于重启。容器的状态也会恢复到初始状态。一旦恢复到初始状态&#xff0c;所有的后天编辑的文件都会消失 容器和节点之间创建一个可以持久化保存容器内文件的存储卷。…

OpenCV-21方盒滤波和均值滤波

一、方和滤波 使用API --- boxFiter(src, ddepth, ksize[,dst[,anchor[, normalize[, borderType]]]])方盒滤波 方盒滤波的卷积核如下所示&#xff1a; --- normalize Ture时&#xff0c; a 1 / &#xff08;W*H&#xff09;滤波器的宽高 --- normalize False时&#xff…