Python PyQt框架中常用类(QMainWindow/Qwidget/QDialog)之间的继承关系梳理---(布局容器)

本文主要梳理Python PyQt框架中几个常用类的继承关系。首先介绍了QMainWindow、QWidget、QDialog三种窗体的区别及选用场景,如主窗口用QMainWindow,对话框用QDialog等。接着阐述了类之间的继承关系,包括创建对象和实例对象,以及将窗口挂载到主窗口的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python PyQt框架中几个常用类之间的继承关系梳理

缘起:最近在新建一个qt项目过程中遇到的类的继承关系和窗体类的选用
1.窗体之间的区别及选用:

主要参考这位大佬写的QMainWindow/Qwidget/QDialog区别:添加链接描述

窗口常见的类型介绍:QMainWindow、QWidget、QDialog三个类都可以用来创建窗口。可以直接使用,也可以继承后使用。

1.1 QMainWindow窗口包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式,也可以说是GUI程序的主窗口-----如果是主窗口,就使用QMainWindow类;
  QMainWindow的布局如下图所示:在这里插入图片描述

1.2 QDialog是对话框窗口的基类。对话框主要用来执行短期任务,或者与用户进行互动,它可以是模态的,也可以是非模态的。他没有菜单栏、工具栏、状态栏等-------如果是对话框,就使用QDialog类;
1.3 QWidget类,一个简单的窗口----如果不确定,有可能作为顶层窗口,也有可能嵌入到其他窗口,就使用QWidget类。
 QWidget运行后就只有一个“页面”,而QMainWindow运行后生成了一个“窗口”。

2.类之间继承关系即各容器的继承关系

整体思路:
2.1创建对对象和实例对象:
2.1.1 实例对象— MainWindow2 = QtWidgets.QMainWindow()
QtWidgets模块下的QMainWindow()类 创建主窗体实例对象(作为父容器)
2.1.2 类对象—Test_MainWindow(QtWidgets.QWidget)
通过继承QtWidgets模块下的QWidget类创建子类:Test_MainWindow()
2.1.3实例对象----ui = Test_MainWindow()
通过ui = Test_MainWindow()来实例化一个实例对象:ui

2.2. 将ui窗口挂在主窗口上。
说明:ui.setupUi(MainWindow2)#MainWindow2作为父容器,MainWindow2作为参数传递给ui,这样ui这个实例就能显示在主窗口上。

其中各个变量的含义(搞清楚基本变量含义很重要):
MainWindow2是实例对象。
Test_MainWindow是类对象。
ui是实例对象。
MainWindow2是实际参数。
MainWindow1是形式参数

将思路结合一下代码就很清楚了!

主函数及其对于的功能代码如下:

def show_MainWindow():
        app = QtWidgets.QApplication(sys.argv)
        MainWindow2 = QtWidgets.QMainWindow()  #此处创建的是窗体MainWindow2
        ui = Test_MainWindow() #通过Test_MainWindow这个子类实例化一个实例ui
        ui.setupUi(MainWindow2)#MainWindow2作为父容器,MainWindow2作为参数传递给ui,这样ui这个实例就能显示在主窗口上。
        MainWindow2.show()
        sys.exit(app.exec_())

具体qt界面功能代码如下:

class Test_MainWindow(QtWidgets.QWidget):#Test_MainWindow是继承自QtWidgets.Qwidget这个类的一个子类
    def setupUi(self, MainWindow1):
        MainWindow1.setObjectName("MainWindow12222")
        MainWindow1.resize(838, 596)
        self.centralwidget = QtWidgets.QWidget(MainWindow1)
		#其他code省略……………………
<think>首先,用户的问题是关于Qt中三个基类的区别:QMainWindowQWidgetQDialog。我需要参考提供的引用内容来构建回答。 回顾引用: - 引用[1]:解释了QMainWindow是主窗口类,支持菜单栏、工具栏等。 - 引用[2]:详细比较了QWidgetQDialogQMainWindow的区别。 - 引用[3]:在PyQt5中比较了三种窗口类型,包括继承关系和特性。 用户的问题是:“我想理解在创建Qt类时,基类QMainWindowQWidgetQDialog之间的区别”,所以核心是解释它们的区别。 回答结构: - 系统级指令要求使用中文回答。 - 结构清晰:逐步解释每个基类,然后比较区别。 - 使用LaTeX格式:行内数学表达式用$...$,独立公式用$$...$$。但这个问题可能不涉及数学表达式,所以可能不需要。 - 生成相关问题:在回答后添加相关问题。 - 引用标识:在引用的段落末尾自然地添加引用标识,如[^1]。 从引用中提取关键点: - QWidget:是所有用户界面对象的基类。它是矩形部件,可以接收事件和绘制自己。适合自定义控件或子组件。 - QMainWindow:继承自QWidget,用于主应用程序窗口。包含菜单栏、工具栏、状态栏和中央部件。 - QDialog:继承自QWidget,用于对话框窗口。可以是模态或非模态,适合短期任务和用户交互。 组织回答: 1. 介绍每个基类的定义和用途。 2. 比较它们的区别:继承关系、典型结构、应用场景、交互特性。 3. 提供示例或建议何时使用哪个。 4. 自然地添加引用标识。 5. 结尾添加相关问题。 回答大纲: - 引言:简述Qt中的窗口基类。 - 解释QWidget:基类,所有UI对象的父类。 - 解释QMainWindow:用于主窗口。 - 解释QDialog:用于对话框。 - 比较表格或列表:清晰展示区别。 - 使用建议。 - 相关问题。 确保回答真实可靠:基于提供的引用,避免添加未经验证的信息。 生成相关问题: - 如系统指令示例:生成2-3个相关问题。 - 相关问题应与主题相关,比如优化、性能、应用场景等。 最终回答结构: - 使用中文。 - 清晰分段。 - 引用标识:例如,在解释时,如果直接引用,添加[^1], [^2], [^3]。 - 相关问题部分以“§§相关问题§§”开头。</think>### QtQMainWindowQWidgetQDialog基类的区别 在Qt框架中,QMainWindowQWidgetQDialog是三种核心基类,用于创建不同类型的窗口和用户界面。它们的主要区别在于继承关系、结构设计、应用场景和交互特性。以下我将逐步解释它们的定义、特点和使用场景,帮助您理解如何选择适当的基类。 #### 1. **QWidget:所有UI对象的基类** - **定义与继承**:QWidgetQt中所有用户界面对象的基类,QMainWindowQDialog都直接或间接继承自它。每个QWidget实例都是一个矩形区域,可以接收鼠标、键盘事件,并在屏幕上绘制自身[^2]。 - **典型结构**:QWidget本身没有预设布局(如菜单栏或工具栏),需手动管理子部件和事件。它支持Z轴顺序(部件可相互重叠),并可作为顶级窗口或嵌入其他窗口的子组件[^2]。 - **应用场景**:适合创建自定义控件(如按钮、画布)或不确定用途的窗口(可能作为顶级窗口或嵌入父窗口)。例如: ```cpp // 示例:创建自定义QWidget子类 class CustomWidget : public QWidget { Q_OBJECT public: CustomWidget(QWidget *parent = nullptr) : QWidget(parent) { // 手动添加布局和部件 } }; ``` - **交互特性**:非阻塞式交互,需开发者处理事件循环和布局逻辑[^3]。 #### 2. **QMainWindow:主应用程序窗口** - **定义与继承**:QMainWindow继承自QWidget,专为应用程序主窗口设计。它提供内置框架,支持复杂布局管理[^1]。 - **典型结构**:包含固定区域: - 菜单栏(QMenuBar) - 工具栏(QToolBar) - 状态栏(QStatusBar) - 中央部件(centralWidget,用于放置核心内容) - Dock窗口(QDockWidget,可停靠面板)[^1][^3]。 - **应用场景**:适用于长期运行的主窗口,如文本编辑器、IDE或图形软件。示例: ```cpp // 示例:QMainWindow基本用法 class MainAppWindow : public QMainWindow { Q_OBJECT public: MainAppWindow(QWidget *parent = nullptr) : QMainWindow(parent) { setCentralWidget(new QTextEdit); // 设置中央文本编辑器 addToolBar(new QToolBar); // 添加工具栏 } }; ``` - **交互特性**:支持高效布局管理,槽机制可响应菜单和工具栏事件,适合复杂交互[^1][^3]。 #### 3. **QDialog:对话框窗口** - **定义与继承**:QDialog也继承自QWidget,是对话框的基类。对话框用于短期任务和用户交互[^2]。 - **典型结构**:布局简洁,通常包含按钮、输入框等。可添加右下角尺寸调整手柄(setSizeGripEnabled())。支持模态(阻塞主窗口)或非模态(非阻塞)模式[^2][^3]。 - **应用场景**:适合设置窗口、文件选择器、确认框等临时交互。例如: ```cpp // 示例:创建模态对话框 class SettingsDialog : public QDialog { Q_OBJECT public: SettingsDialog(QWidget *parent = nullptr) : QDialog(parent) { setModal(true); // 设置为模态 auto layout = new QVBoxLayout; layout->addWidget(new QLineEdit); // 添加输入框 setLayout(layout); } }; ``` - **交互特性**:提供返回值(如QDialog::Accepted)、默认按钮,扩展性强[^2][^3]。 #### 4. **核心区别总结** 下表对比三者的关键差异,基于继承关系和实际用途: | 特性 | QWidget | QMainWindow | QDialog | |--------------------|----------------------------------|----------------------------------|----------------------------------| | **继承关系** | 基类(QMainWindowQDialog的父类) | 继承自QWidget | 继承自QWidget | | **典型结构** | 无预设布局,需手动管理 | 固定区域:菜单栏、工具栏、中央部件等 | 简洁布局,支持按钮/输入框 | | **应用场景** | 自定义控件、子组件或不确定用途窗口 | 主应用程序窗口(如IDE、编辑器) | 临时对话框(如设置窗口、确认框) | | **交互特性** | 非阻塞,需自定义事件处理 | 支持复杂布局和槽机制 | 可模态(阻塞主窗口),提供返回值 | | **何时使用** | 部件需嵌入父窗口或作为通用容器 | 创建应用程序的主界面 | 实现短期用户交互任务 | #### 5. **使用建议** - **选择QMainWindow**:当需要构建带菜单、工具栏的复杂主窗口时[^1]。 - **选择QDialog**:用于弹出式交互,如设置或确认操作[^2]。 - **选择QWidget**:当窗口可能嵌入其他部件或作为轻量级容器时[^3]。 实际开发中,可根据需求派生自定义类,例如基于QWidget创建可重用的子组件,或基于QDialog扩展文件对话框[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值