首页 > 解决方案 > PyQt5:使用类创建 Windows

问题描述

我有一个看起来像这样的 PyQt5 应用程序(我知道我有很多导入,我正在学习,所以我现在想要完全自由):

import sys
from PyQt5.QtGui import *
from PyQt5.QWidgets import *
from PyQt5.QtCore import *

class Menu(QMainWindow):

    def __init__(self)
        super().__init__()

        #create bar
        bar = self.menuBar()

        #create bar menus
        file = bar.addMenu("File")
        about = bar.addMenu("About")

        #create actions
        quit_action = QAction("&Quit", self)
        quit_action.setShortcut('Ctrl+Q')
        about_action = QAction("&About...", self)

        #add actions
        file.addAction(quit_action)
        about.addAction(about_action)

        #what to do with actions
        quit_action.triggered.connect(self.quit_func)
        about_action.triggered.connect(self.about_func)

        #window properties
        self.setWindowTitle("Hello World")
        self.resize(600, 400)

        self.show()

    def quit_func(self):
        sys.exit()

    def about_func(self):
        pass

class About(QWidget):

    def __init__(self):
        super().__init__(parent)

        #widgets
        self.l1 = QLabel('Hello World')
        self.l1.setAlignment(Qt.AlignCenter)
        self.l2 = QLabel('Description of the Application')
        self.l2.setAlignment(Qt.AlignCenter)

        #horiz box
        h_box = QHBoxLayout()
        h_box.addStretch()
        h_box.addWidget(self.l2)
        h_box.addStretch()

        #vert box
        v_box = QVBoxLayout()
        v_box.addWidget(self.l1)
        v_box.addLayout(h_box)
        v_box.addStretch()

        self.setLayout(v_box)

        #window properties
        self.setWindowTitle("About Hello World")
        self.setFixedSize(250,150)

        self.show()

if not QApplication.instance()
    app = QApplication(sys.argv)
else:
    app = QApplication.instance()

main = Menu()
main.show()

sys.exit(app.exec())

我希望 about_func() 函数调用 About() 类,这样我就可以打开一个与 Menu() 类创建的主窗口分开的窗口。

此代码引发错误:

TypeError: QMainWindow(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 1 has unexpected type 'sip.wrappertype'

参考super().__init__()第 9 行。

我怎样才能以一种有效的方式实现这一点?随意批评我的代码的任何方面。

(编辑澄清问题)

标签: pythonclasspyqtpyqt5

解决方案


从您的代码来看,您使用的是 Python 2 还是 3 并不是很清楚,无论如何,super 的基本语法是:

super(yourClass, instance).method(args)

因此,在您的情况下,它们都是错误的:-) 第一个应该是:

class Menu(QMainWindow):
    def __init__(self, parent=None):
        super(Menu, self).__init__(parent)

此外,在 Python3 中,可以省略 super() 的参数,因此第二个示例可以是:

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

仔细阅读内置函数。我知道这是一个很长的页面,但它包含了 Python 的一些基础知识,学习/理解它们几乎是强制性的。


推荐阅读