PyQt5:使用类创建Windows

时间:2018-09-17 23:50:19

标签: python class pyqt pyqt5

我构建了一个看起来像这样的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'

关于第9行中的super().__init__()

我该如何以有效的方式实施此操作?随时批评我的代码的任何方面。

(编辑以澄清问题)

1 个答案:

答案 0 :(得分:1)

从您的代码中还不清楚是使用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)

仔细阅读Built-in Functions。我知道这是一个很长的页面,但是它包含了Python的一些基础知识,对它们的研究/理解几乎是必须的。