QWidget、QDialog、QMainWindow 的异同点

QWidget、QDialog、QMainWindow 的异同点简述在分享所有基础知识之前 很有必要在这里介绍下常用的窗口 QWidget QDialog QMainWindow 熟悉 Qt 的同学都应该知道 在新建 QtWidgets 项目进行类信息选择时会碰到它们 没错 很巧 每次都能碰到 所以 在以后的 Qt 开发中 我们会经常和它们打交道 常言道 知己知彼 百战不殆 只有了解它们 熟悉它们 才能更好地驾驭它们 QWidget 继承于 QObject 和 QPaintD

简述

在分享所有基础知识之前,很有必要在这里介绍下常用的窗口 – QWidget、QDialog、QMainWindow。

QWidget继承于QObject和QPaintDevice,QDialog和QMainWindow则继承于QWidget,QDialog、QMainWindow两者之间没有直接关系。淘气的小盆友又不高兴了,它俩分明同属于一个父亲,那就是兄弟姊妹关系O(∩_∩)O哈哈~。

| 版权声明:一去、二三里,未经博主允许不得转载。

QWidget

QWidget类是所有用户界面对象的基类。

窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且将自己的表现形式绘制在屏幕上。每一个窗口部件都是矩形,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。

QWidget有很多成员函数,但是它们中的一些有少量的直接功能:例如,QWidget有字体属性,但是自己从来不用。为很多继承它的子类提供了实际的功能,比如QLabel、QPushButton、QCheckBox等等。

没有父窗体的小部件始终是一个独立的窗口(顶级窗口部件)。非窗口的小部件为子部件,它们在父窗口中显示。Qt中大多数部件主要被用作子部件。例如:可以显示一个按钮作为顶层窗口,但大多数人更喜欢将按钮内置于其它部件,如QDialog。

这里写图片描述

上图显示了一个QGroupBox,里面包含了大量由QGridLayout布局的子控件。

QDialog

QDialog类是对话框窗口的基类。

对话框窗口是一个顶级窗体,主要用于短期任务以及和用户进行简要通讯。QDialog可以是模式的也可以是非模式的。QDialog支持扩展性并且可以提供返回值。它们可以有默认按钮。QDialog也可以有一个QSizeGrip在它的右下角,使用setSizeGripEnabled()。

注意:QDialog(以及其它使用Qt::Dialog类型的widget)使用父窗口部件的方法和Qt中其它类稍微不同。对话框总是顶级窗口部件,但是如果它有一个父对象,它的默认位置就是父对象的中间。它也将和父对象共享工具条条目。

模式对话框

阻塞同一应用程序中其它可视窗口输入的对话框。模式对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口。模式对话框仅阻止访问与对话相关联的窗口,允许用户继续使用其它窗口中的应用程序。

显示模态对话框最常见的方法是调用其exec()函数,当用户关闭对话框,exec()将提供一个有用的返回值,并且这时流程控制继续从调用exec()的地方进行。通常情况下,要获得对话框关闭并返回相应的值,我们连接默认按钮,例如:”确定”按钮连接到accept()槽,”取消”按钮连接到reject()槽。另外我们也可以连接done()槽,传递给它Accepted或Rejected。

非模式对话框

和同一个程序中其它窗口操作无关的对话框。在文字处理中的查找和替换对话框通常是非模式的,允许用户同时与应用程序的主窗口和对话框进行交互。调用show()来显示非模式对话框,并立即将控制返回给调用者。

如果隐藏对话框后调用show()函数,对话框将显示在其原始位置,这是因为窗口管理器决定的窗户位置没有明确由程序员指定,为了保持被用户移动的对话框位置,在closeEvent()中进行处理,然后在显示之前,将对话框移动到该位置。

半模式对话框

调用setModal(true)或者setWindowModality(),然后show()。有别于exec(),show() 立即返回给控制调用者。

对于进度对话框来说,调用setModal(true)是非常有用的,用户必须拥有与其交互的能力,例如:取消长时间运行的操作。如果使用show()和setModal(true)共同执行一个长时间操作,则必须定期在执行过程中调用QApplication::processEvents(),以使用户能够与对话框交互(可以参考QProgressDialog)。

QMainWindow

QMainWindow类提供一个有菜单条、工具栏、状态条的主应用程序窗口(例如:开发Qt常用的IDE-Visual Studio、Qt Creator等)。

一个主窗口提供了构建应用程序的用户界面框架。Qt拥有QMainWindow及其相关类来管理主窗口。

QMainWindow拥有自己的布局,我们可以使用QMenuBar(菜单栏)、QToolBar(工具栏)、QStatusBar(状态栏)以及QDockWidget(悬浮窗体),布局有一个可由任何种类小窗口所占据的中心区域。

例如:

这里写图片描述

使用原则

  • 如果需要嵌入到其他窗体中,则基于QWidget创建。
  • 如果是顶级对话框,则基于QDialog创建。
  • 如果是主窗体,则基于QMainWindow创建。

在以后的Qt开发中,会经常和它们打交道。常言道,知己知彼,百战不殆。只有了解它们、熟悉它们,才能更好地驾驭它们。。。

更多参考

  • Qt之模式、非模式、半模式对话框
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212692.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午7:29
下一篇 2026年3月18日 下午7:30


相关推荐

  • InetAddress

    InetAddressInetAddress类就是封装了IPv4地址和IPv6地址。比较简单,这是muduo库中少有的值语义的类,所以继承的是copyable。实际上copyable只是强调可以拷贝,并没有实际意义。即使不继承该类还是可以copy。InetAddress::InetAddress(uint16_tport,boolloopbackOnly,boolipv6){static_assert(offsetof(InetAddress,addr6_)==0,”addr6_offset0

    2022年6月23日
    36
  • python编程入门与案例详解-"Python小屋”免费资源汇总(截至2018年11月28日)…「建议收藏」

    python编程入门与案例详解-"Python小屋”免费资源汇总(截至2018年11月28日)…「建议收藏」原标题:"Python小屋”免费资源汇总(截至2018年11月28日)为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋”开通29个月以来推送过的700多篇文章清单,如果需要本清单的电子版,可以在公众号后台发送消息"资源汇总”获取下载地址。非计算机专业《Python程序设计基础》教学参考大纲计算机相关专业"Python程序设计”教…

    2022年10月2日
    3
  • 电商社交数据在大数据风控的应用实践

    电商社交数据在大数据风控的应用实践

    2022年3月3日
    29
  • 阿帕奇服务器搭建_阿帕奇服务器工作原理

    阿帕奇服务器搭建_阿帕奇服务器工作原理在官网http://tomcat.apache.org/下载后的是一个压缩文件,在解压后没有环境,需要自己配一下环境。想配置阿帕奇环境必须有java环境。进入解压后的文件夹的bin目录下。进入cmd,

    2022年8月6日
    27
  • 里氏代换原则详解

    里氏代换原则详解里氏代换原则定义 里氏代换原则 LiskovSubsti 面向对象设计的基本原则之一 里氏代换原则中说 任何基类可以出现的地方 子类一定可以出现 LSP 是继承复用的基石 只有当衍生类可以替换掉基类 软件单位的功能不受到影响时 基类才能真正被复用 而衍生类也能够在基类的基础上增加新的行为 里氏代换原则是对 开 闭 原则的补充 实现 开 闭 原则的关键步骤就是抽象化 而基类与子类的继承关系就是抽象化的具体实现 所以里氏代换原则是对实现抽象化的具体步骤的规

    2026年3月17日
    2
  • hibernate执行原生sql_hibernate的find方法

    hibernate执行原生sql_hibernate的find方法如果查询返回多个值用list()方法[java] viewplaincopyprint?public void testQuery(){          Configuration config = new Configuration().configure();          SessionFactory factory =

    2025年8月27日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号