PyQt ------ QMainWindow 与 QWidget 继承的不同之处

引言

不知道大家有没有相同的困惑,就是在使用PyQt5设计App的时候不知道应该用class App类继承QMainWindow类还是QWidget类。这里我根据自己的理解来对这个问题进行一下说明。我们先来看两个分别继承不同类的例子。

正文

示例1------从 QMainWindow 类继承

详情请参考 PyQt5 基础框架。这里我们从 QMainWindow类继承了并且得到了我们自己创建的 Gui 界面。

那可不可以从 QWidget 类继承呢?答案是可以的。

示例2------从 QWidget 类继承

import sys
from PyQt5.QtWidgets import QApplication, QListWidget, QHBoxLayout, QWidget


class App(QWidget):
    def __init__(self, parent=None):
        super(App, self).__init__(parent)

        self.left_list = QListWidget()
        self.left_list.insertItem(0, "Contact")
        self.left_list.insertItem(1, "Personal")
        self.left_list.insertItem(2, "Educational")

        hbox = QHBoxLayout()
        hbox.addWidget(self.left_list)

        # add this layout on QWidget
        self.setLayout(hbox)


def main():
    app = QApplication(sys.argv)
    window = App()
    window.show()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

运行后的结果如下图所示:
在这里插入图片描述
但是这里有一个有趣的现象,在示例2中,当我们使用class AppQMainWindow类继承时,Gui界面就无法正常显示了,这是因为QMainWindowQWidget并不完全相同,它们分别有各自的应用场景。

QWidget通常是其他Gui元件(如: QLabel)的基础类,它可以自己形成一个窗口,或者是一个布局的一部分,也可以是一个继承的子类或者父类的成员。
QMainWindow是一个简便的应用类,他有很多内置的特性,比如状态栏(在我们前面的PyQt5框架中也有提到),工具栏和菜单。

所以在例子1中我们创建的是状态栏元件,因此我们需要从QMainWindow类中继承,如果替换为QWidget,则无法正常显示,可以自行尝试。

同理在例子2中,如果我们需要从QWidget中继承,如果我们从QMainWindow类中继承则无法正常显示,因为QMainWindow不支持QListWidget以及QDialog元件。

总结

总而言之,QMainWindow 类包含 status barmenu bar 选项,如果我们希望在我们的 Gui 界面中加入这些组件,我们就需要从 QMainWindow 中继承。制作完整的带有 Gui 界面的 App 通常需要从 QMainWindow 类中进行继承。

而其他众多类,比如 QLineEditQTextEdit 等等,它们都需要作用在 QWidget 类创建的 Widget 组件上。对于简易的 Gui 界面,我们只需要从 QWidget 类中继承即可。

一个从 QMainWindow 类中继承的 Gui 窗口可以包含很多个 QWidget 组件,因此它们之间属于包含关系。只是 QMainWindow 类的功能更复杂和强大,很多时候我们用不到。

如果大家觉得有用,就请点个赞吧~

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的大熊猫

你的鼓励将是我写作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值