必须在QWidget Pyqt5之前构造QApp

must construct QApp before QWidget Pyqt5

我启动了新的 PyQt5 程序,但遇到错误 "Must construct QApplication before QWidget"。

我明白这个错误,但没有找到我的代码首先在哪里构造我的 QWidget。

这是我的代码:

class Main(QWidget):
    """ Main window """
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        self.business_list = ['Acheté à', 'Vendu à']

    # Pet form
    petFormGroupBox = QGroupBox("Description de l'animal")
    pet_layout = QFormLayout()
    pet_layout.addRow(QLabel("Nom scientifique:"), QLineEdit())
    pet_layout.addRow(QLabel("Sexe:"), QLineEdit())
    pet_layout.addRow(QLabel("Année de naissance:"), QDateEdit())
    pet_layout.addRow(QLabel("Cause décès:"), QLineEdit())
    petFormGroupBox.setLayout(pet_layout)

    # Business form
    petBusinessFormGroupBox = QGroupBox("Achats / Ventes")
    pet_business_layout = QFormLayout()
    pet_layout.addRow(QLabel("Nom complet + N° d'autorisation"), QLineEdit())
    petBusinessFormGroupBox.setLayout(pet_business_layout)

    business_btn_group = QRadioButton()

    for each in self.business_list:
        self.business_list.append(QRadioButton(each))

    self.business_list[0].setChecked(True)
    business_choices_layout = QHBoxLayout()
    counter = 1
    for each in self.business_list:
        business_choices_layout.addWidget(each)
        business_btn_group.addButton(each)
        business_btn_group.setId(each, counter)

    pet_business_layout.addWidget(business_choices_layout)

    hbox = QHBoxLayout()
    hbox.addWidget(pet_layout)
    hbox.addWidget(pet_business_layout)

    self.setLayout(hbox)

class Cites(QMainWindow):
    """ Cites app """
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle('CITES')
        self.setWindowState(Qt.WindowMaximized)

        exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(qApp.quit)

        fileMenu = self.menuBar().addMenu('File')
        fileMenu.addAction(exitAct)

        toolbar = self.addToolBar('Main')
        toolbar.addAction(exitAct)

        main = Main()
        self.setCentralWidget(main)

        self.statusBar().showMessage('Bienvenue dans CITES')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Cites()
    ex.show()
    sys.exit(app.exec_())

如果你有什么想法,我很高兴!

新年快乐,享受你的代码:)。

谢谢预付

您的代码缩进不正确。 Main class 中 # Pet form 之后的所有行都应该缩进两次(即 8 个空格),以便它们成为 __init__ 构造函数的一部分。这样它将在您创建类型为 Main() 的对象时执行,这应该在您创建了 QApplication 对象之后执行。

目前它只缩进一次(即 4 个空格),这意味着它是 class 定义的一部分。因此,在创建 QApplication 对象之前,这些行在 class 定义期间执行。因此出现错误消息。

修复很简单,只需像这样缩进代码即可:

class Main(QWidget):
    """ Main window """
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        self.business_list = ['Acheté à', 'Vendu à']

        # Pet form
        petFormGroupBox = QGroupBox("Description de l'animal")
        pet_layout = QFormLayout()
        pet_layout.addRow(QLabel("Nom scientifique:"), QLineEdit())
        pet_layout.addRow(QLabel("Sexe:"), QLineEdit())
        pet_layout.addRow(QLabel("Année de naissance:"), QDateEdit())
        pet_layout.addRow(QLabel("Cause décès:"), QLineEdit())
        petFormGroupBox.setLayout(pet_layout)

        # Business form
        petBusinessFormGroupBox = QGroupBox("Achats / Ventes")
        pet_business_layout = QFormLayout()
        pet_layout.addRow(QLabel("Nom complet + N° d'autorisation"), QLineEdit())
        petBusinessFormGroupBox.setLayout(pet_business_layout)

        business_btn_group = QRadioButton()

        for each in self.business_list:
            self.business_list.append(QRadioButton(each)) # infinite recursion here!

        self.business_list[0].setChecked(True)
        business_choices_layout = QHBoxLayout()
        counter = 1
        for each in self.business_list:
            business_choices_layout.addWidget(each)
            business_btn_group.addButton(each)
            business_btn_group.setId(each, counter)

        pet_business_layout.addWidget(business_choices_layout)

        hbox = QHBoxLayout()
        hbox.addWidget(pet_layout)
        hbox.addWidget(pet_business_layout)

        self.setLayout(hbox)

请注意,代码现在将挂在以下循环中,因为您在遍历该循环时将元素添加到列表中。这是你必须自己解决的问题。

for each in self.business_list:
    self.business_list.append(QRadioButton(each)) # infinite recursion here!