Pyside2.QtCore.QObject 不是 MyTableWidget 的直接基类——PySide2 出错

Posted

技术标签:

【中文标题】Pyside2.QtCore.QObject 不是 MyTableWidget 的直接基类——PySide2 出错【英文标题】:Pyside2.QtCore.QObject isn't a direct base class of MyTableWidget -- Error with PySide2 【发布时间】:2019-01-29 17:11:37 【问题描述】:

我有 C++ 背景,所以也许我不太了解 Python 类,但在我的代码中出现上述错误。我正在尝试学习 PySide2 和 Qt,我从 PyQt 教程中获取了这段代码。据我所知,这些都是 API 兼容的,除了我修复的几件事,所以这应该可以工作。

我使用的代码如下:

import sys
from PySide2.QtWidgets import QMainWindow, QApplication, QPushButton, QWidget, QAction, QTabWidget,QVBoxLayout
from PySide2.QtGui import QIcon
from PySide2.QtCore import Slot

class App(QMainWindow):

    def __init__(self):
        super().__init__()
        self.title = 'Tabbed window'
        self.left = 0
        self.top = 0
        self.width = 300
        self.height = 200
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.table_widget = MyTableWidget(self)
        self.setCentralWidget(self.table_widget)

        self.show()

class MyTableWidget(QWidget):

    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.layout = QVBoxLayout(self)

        # Initialize tab screen
        self.tabs = QTabWidget()
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tabs.resize(300,200)

        # Add tabs
        self.tabs.addTab(self.tab1,"Tab 1")
        self.tabs.addTab(self.tab2,"Tab 2")

        # Create first tab
        self.tab1.layout = QVBoxLayout(self)
        self.pushButton1 = QPushButton("Button")
        self.tab1.layout.addWidget(self.pushButton1)
        self.tab1.setLayout(self.tab1.layout)

        # Add tabs to widget
        self.layout.addWidget(self.tabs)
        self.setLayout(self.layout)

    @Slot()
    def on_click(self):
        print("\n")
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
        print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text())

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

【问题讨论】:

应该是super(MyTableWidget, self).__init__(parent),但是如果你使用python3,你可以直接使用super().__init__(parent)(见:super)。 抱歉,currentQTableWidgetItemself.qtableWidget 是什么? 【参考方案1】:

在您的情况下,正如ekhumoro 所说,问题出在super 调用上,您需要引用MyTableWidget 而不是QWidget

通常在从另一个继承的 Python 类中,您有三个选项(考虑 Python 3)。我建议你选择一个并坚持下去;)

class Base():
    ...
class Derived(Base):
    ...


# Getting the super class (explicit)
super(Derived, self).__init__(...)

# Getting the super class (implicit)
super().__init__(...)

# Call the parent directly
Base.__init__(...)

【讨论】:

以上是关于Pyside2.QtCore.QObject 不是 MyTableWidget 的直接基类——PySide2 出错的主要内容,如果未能解决你的问题,请参考以下文章

既不是 URL 也不是 URN 的 URI 是不是存在?

JsonMappingException:不是地图,不是数组或不是枚举

检查键盘输入是不是为空或不是“Y”或不是“X”

'gradlew' 不是内部或外部命令,也不是可运行的程序

C下标值既不是数组也不是指针也不是向量

如何检查字符串是不是至少包含一个数字、字母和既不是数字也不是字母的字符?