PyQt5 QMainWindow与QWidget继承的不同之处

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

例子1.从QMainWindow类继承,详情请参考PyQt5 基础框架。很明显,这里我们继承了QMainWindow类并且得到了我们想要的结果。

那可不可以从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()

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

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

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

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

码字不易,如果大家觉得有用,请高抬贵手给一个赞让我上推荐让更多的人看到吧~

你可能感兴趣的:(PyQt5,python,Gui,pyqt5)