当前位置: 首页 > news >正文

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 的孙子控件。控件之间的父子关系在布局、显示和事件处理等方面都具有重要意义。

相关文章:

112.Qt中的窗口类

我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类, 下拉菜单中有三个选项, 分别为: QMainWindow、QDialog、QWidget如下图: 常用的窗口类有3个 在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的…...

如何设置电脑桌面提醒,电脑笔记软件哪个好?

对于大多数上班族来说,每天要完成的待办事项实在太多了,如果不能及时去处理,很容易因为各种因素导致忘记,从而给自己带来不少麻烦。所以,我们往往会借助一些提醒类的软件将各项任务逐一记录下来,然后设置上…...

C# HttpClient Get Post简单封装

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

创建网格(Grid/GridItem)

目录 1、概述 2、布局与约束 3、设置排列方式 3.1设置行列数量与占比 3.2、设置子组件所占行列数 3.3、设置主轴方向 3.4、在网格布局中显示数据 3.5、设置行列间距 4、构建可滚动的网格布局 5、实现简单的日历功能 6、性能优化 1、概述 网格布局是由“行”和“列”分…...

思科路由器忘记密码怎么重置

断电重启路由器&#xff0c;在开机过程中按下CtrlPause/break&#xff0c;或者只按下Pause/break&#xff08;没有测试&#xff09;&#xff0c;在PT&#xff08;Cisco Packet Tracert&#xff09;中则需要按CtrlC。路由器会进入rommon >模式。 切换到0x2142模式&#xff0…...

JVM基础(2)——JVM内存模型

一、简介 JVM会加载类到内存中&#xff0c;所以 JVM 中必然会有一块内存区域来存放我们写的那些类。Java中有类对象、普通对象、本地变量、方法信息等等各种对象信息&#xff0c;所以JVM会对内存区域进行划分&#xff1a; JDK1.8及以后&#xff0c;上图中的方法区变成了Metasp…...

使用 Process Explorer 和 Windbg 排查软件线程堵塞问题

目录 1、问题说明 2、线程堵塞的可能原因分析 3、使用Windbg和Process Explorer确定线程中发生了死循环 4、根据Windbg中显示的函数调用堆栈去查看源码&#xff0c;找到问题 4.1、在Windbg定位发生死循环的函数的方法 4.2、在Windbg中查看变量的值去辅助分析 4.3、是循环…...

做科技类的展台3d模型用什么材质比较好---模大狮模型网

对于科技类展台3D模型&#xff0c;以下是几种常用的材质选择&#xff1a; 金属材质&#xff1a;金属材质常用于科技展台的现代感设计&#xff0c;如不锈钢、铝合金或镀铬材质。金属材质可以赋予展台一个科技感和高档感&#xff0c;同时还可以反射光线&#xff0c;增加模型的真实…...

EasyExcel简单实例(未完待续)

EasyExcel简单实例 准备工作场景一&#xff1a;读取 Student 表需求1&#xff1a;简单读取需求2&#xff1a;读取到异常信息时不中断需求3&#xff1a;读取所有的sheet工作表需求4&#xff1a;读取指定的sheet工作表需求5&#xff1a;从指定的行开始读取 场景二&#xff1a;写入…...

ROS2学习笔记一:安装及测试

目录 前言 1 ROS2安装与卸载 1.1 安装虚拟机 1.2 ROS2 humble安装 2 ROS2测试 2.1 topic测试 2.2 小海龟测试 2.3 RQT可视化 2.4 占用空间 前言 ROS2的前身是ROS&#xff0c;ROS即机器人操作系统&#xff08;Robot Operating System&#xff09;,ROS为了“提高机器人…...

Xcode14.3.1真机调试iOS17的方法

Hello&#xff0c;大家好我是咕噜铁蛋&#xff01;Xcode 是苹果官方开发工具&#xff0c;它提供了完整的开发环境和工具集&#xff0c;支持开发 iOS、macOS、watchOS 和 tvOS 应用程序。对于 iOS 开发者来说&#xff0c;Xcode 是必备的工具之一。而随着 iOS 系统的不断更新和升…...

主流大语言模型从预训练到微调的技术原理

引言 本文设计的内容主要包含以下几个方面&#xff1a; 比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节&#xff1a;tokenizer、位置编码、Layer Normalization、激活函数等。大语言模型的分布式训练技术&#xff1a;数据并行、张量模型并行、流水线并行、3D 并行、零冗余优…...

Linux中vim查看文件某内容

一、编辑文件命令 [rootyinheqilin ~]# vim test.txt 1&#xff0c;在编辑的文件中连续按2次键盘的【g】键&#xff0c;光标会移动到文档开头第一行 2&#xff0c;输入一个大写 G&#xff0c;光标会跳转到文件的最后一行第一列&#xff08;末行) 二、查看文件内容命令 gre…...

阿里云提示服务器ip暴露该怎么办?-速盾网络(sudun)

当阿里云提示服务器IP暴露的时候&#xff0c;这意味着您的服务器可能面临安全风险&#xff0c;因为黑客可以通过知道服务器的IP地址来尝试入侵您的系统。在这种情况下&#xff0c;您应该立即采取措施来保护您的服务器和数据。以下是一些建议&#xff1a; 更改服务器IP地址&…...

IP地址的网络安全防护和预防

网络安全对于保护个人和组织的信息资产至关重要&#xff0c;而IP地址是网络通信的基础。在这篇文章中&#xff0c;IP数据云将探讨IP地址的网络安全防护和预防措施&#xff0c;以确保网络的安全性和可靠性。 IP地址是互联网上每个设备在网络中的唯一标识符。有IPv4和IPv6两种类…...

数据挖掘在制造业中的预测与优化应用

随着大数据时代的到来&#xff0c;数据挖掘技术在各行各业的应用日益广泛&#xff0c;尤其在制造业中&#xff0c;其对于提升生产效率、降低运营成本、优化供应链管理等方面发挥着不可替代的作用。本文将探讨数据挖掘在制造业中的预测与优化应用&#xff0c;通过深入剖析实际案…...

Java面试之并发篇(一)

1、前言 本篇主要总结JAVA面试中关于并发相关的高频面试题。本篇的面试题基于网络整理&#xff0c;和自己编辑。在不断的完善补充哦。 2、简述程序、进程、线程、的基本概念&#xff1f; 2.1、程序 程序&#xff0c;是含有指令和数据的文件&#xff0c;被存储在磁盘或其他的…...

分布式全局id

分布式全局id snowflake 算法是 twitter 开源的分布式 id 生成算法&#xff0c;采用 Scala 语言实现&#xff0c;是把一个 64 位的 long 型的 id&#xff0c;1 个 bit 是不用的&#xff0c;用其中的 41 bits 作为毫秒数&#xff0c;用 10 bits 作为工作机器 id&#xff0c;12 …...

springboot 房屋租赁系统

spring boot mysql mybatis 前台后端...

TypeScript接口、对象

目录 1、TypeScript 接口 1.1、实例 1.2、联合类型和接口 1.3、接口和数组 1.4、接口和继承 1.5、单继承实例 1.6、多继承实例 2、TypeScript 对象 2.2、对象实例 2.3、TypeScript类型模板 2.4、鸭子类型&#xff08;Duck typing&#xff09; 1、TypeScript 接口 接口…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...