使用多重继承时 PyQt5 中的 MRO 错误

MRO error in PyQt5 when using multiple inheritance

我是 PyQt5 的新手。我正在尝试使用 menuBar(继承自 QMainWindow class)和一些其他小部件(例如按钮、一些标签和文本编辑器(需要 QWidget class). 这是我的代码。当我尝试将 QMainWindow 和 QWidget 作为 parent classes 添加到 may mainwindow class 时,我收到一条错误消息:“TypeError:无法创建一致的方法解析 order (MRO) for bases QWidget, QMainWindow". 当我只使用 1 parent class for mainwindow class 它工作正常,但在这种情况下我必须使用QMainWindow 和 QWidget 都为 parent classes.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QAction, QMenu, QMainWindow, QTextEdit, QLineEdit, QGridLayout, QLabel

class mainwindow(QWidget, QMainWindow):
    def __init__(self):
        super().__init__()

        self.createUI()
    def createUI(self):
        mymenubar = self.menuBar()
        filemenu = mymenubar.addMenu("File")
        filemenu.addAction("help")
        filemenu.addAction("exit")



        contactlabel = QLabel("Contact:", self)
        contacttextedit = QLineEdit(self)
        countlabel = QLabel("Count:")
        counttextedit = QLineEdit()
        msglabel = QLabel("Your message here:")
        msgbox = QTextEdit()

        grid = QGridLayout()
        grid.setSpacing(10)




        grid.addWidget(contactlabel,1,0)
        grid.addWidget(contacttextedit,1,1)

        grid.addWidget(countlabel,2,0)
        grid.addWidget(counttextedit,2,1)

        grid.addWidget(msglabel,3,0)
        grid.addWidget(msgbox,3,1,5,1)

        self.setLayout(grid)
        self.setGeometry(300,300,300,300)
        self.setWindowTitle("Whatsapp Message Sender")
        self.show()



    # MODIFYING CLOSE EVENT SO IT ASKS BEFORE EXIT
    def closeEvent(self, event):
        reply = QMessageBox.question(self, "Message", "quit?", QMessageBox.Yes| QMessageBox.No, QMessageBox.Yes)

        if reply == QMessageBox.No:
            event.ignore()
        else:
            event.accept()



app = QApplication(sys.argv)
ex = mainwindow()
sys.exit(app.exec_())

我做错了什么?我如何在 class 中同时使用 QWidget 和 QMainwindow?

我认为问题出在 QMainWindow 也继承自 QWidget。也就是说,如果您继承自 QMainWindow,则继承自 QWidget 毫无意义。如果您想放弃 QMainWindow 提供的特殊功能,只需放弃它并使用普通的 QWidget 即可。

您有 2 个错误:

  • QMainWindow 已经继承自 QWidget,因此不需要多重继承,从而导致错误。

  • 你不应该为 QMainWindow 建立布局,因为它已经有一个预定义的结构,而你必须在布局所在的地方创建一个中央容器。

综合以上,解决方案是:

import sys
from PyQt5.QtWidgets import (
    QApplication,
    QWidget,
    QPushButton,
    QMessageBox,
    QAction,
    QMenu,
    QMainWindow,
    QTextEdit,
    QLineEdit,
    QGridLayout,
    QLabel,
)


class mainwindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.createUI()

    def createUI(self):
        mymenubar = self.menuBar()
        filemenu = mymenubar.addMenu("File")
        filemenu.addAction("help")
        filemenu.addAction("exit")

        contactlabel = QLabel("Contact:", self)
        contacttextedit = QLineEdit(self)
        countlabel = QLabel("Count:")
        counttextedit = QLineEdit()
        msglabel = QLabel("Your message here:")
        msgbox = QTextEdit()

        grid = QGridLayout()
        grid.setSpacing(10)

        grid.addWidget(contactlabel, 1, 0)
        grid.addWidget(contacttextedit, 1, 1)

        grid.addWidget(countlabel, 2, 0)
        grid.addWidget(counttextedit, 2, 1)

        grid.addWidget(msglabel, 3, 0)
        grid.addWidget(msgbox, 3, 1, 5, 1)

        # self.setLayout(grid)
        central_widget = QWidget()
        central_widget.setLayout(grid)
        self.setCentralWidget(central_widget)
        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle("Whatsapp Message Sender")
        self.show()

    # MODIFYING CLOSE EVENT SO IT ASKS BEFORE EXIT
    def closeEvent(self, event):
        reply = QMessageBox.question(
            self, "Message", "quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes
        )

        if reply == QMessageBox.No:
            event.ignore()
        else:
            event.accept()


if __name__ == "__main__":

    app = QApplication(sys.argv)
    ex = mainwindow()
    sys.exit(app.exec_())