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



我是PyQt5的新手。我正在尝试创建一个带有menuBar(继承自QMainWindow类(和一些其他小部件(如按钮,一些标签和文本编辑器(需要QWidget类(的窗口。 这是我的代码。当我尝试将 QMainWindow 和 QWidget 作为父类添加到 may 主窗口类时,我收到一条错误消息:"类型错误:无法创建一致的方法解析 订单 (MRO( for bases QWidget, QMainWindow"。当我只使用 1 个父类作为主窗口类时,它工作正常,但在这种情况下,我必须同时使用 QMainWindow 和 QWidget 作为父类。

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_())

我做错了什么?如何在课堂上同时使用 QWidget 和 QMainwindow?

您有 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_())

我认为问题来自QMainWindow也继承自QWidget的事实。也就是说,如果您从QWidget继承,那么从QMainWindow继承是没有意义的。如果您想删除QMainWindow提供的特殊功能,只需删除它并使用普通QWidget即可。

相关内容

  • 没有找到相关文章

最新更新