Python 从第二个类调用方法以更新QListView数据

Python 从第二个类调用方法以更新QListView数据,python,pyqt5,Python,Pyqt5,我有两个选项卡,选项卡1和选项卡2。在Tab2上,有一个按钮,单击该按钮时会调用更新同一选项卡中QListView数据的方法。这是成功的 当试图从另一个类调用相同的方法时,它将不起作用。下面是一个最小的可复制示例 import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import ( QDesktopWidget, QVBoxLayout, QHBoxLayout, Q

我有两个选项卡,选项卡1和选项卡2。在Tab2上,有一个按钮,单击该按钮时会调用更新同一选项卡中QListView数据的方法。这是成功的

当试图从另一个类调用相同的方法时,它将不起作用。下面是一个最小的可复制示例

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (
    QDesktopWidget,
    QVBoxLayout,
    QHBoxLayout,
    QPushButton,
)
from PyQt5.QtCore import Qt


class App(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('App')
        self.resize(1200, 800)
        self.center()
        self.window = MainWindow(self)
        self.setCentralWidget(self.window)
        self.show()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


class MainWindow(QtWidgets.QWidget):
    def __init__(self, parent):
        super(MainWindow, self).__init__(parent)

        layout = QVBoxLayout(self)

        # Initialize Tabs
        tab_holder = QtWidgets.QTabWidget()
        tab1 = Home()
        tab2 = SecondTab()

        tab_holder.addTab(tab1, "Tab1")
        tab_holder.addTab(tab2, 'Tab2')
        layout.addWidget(tab_holder)


class Home(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Home, self).__init__(parent)
        lay = QVBoxLayout(self)

        self.btn_login = QPushButton('Login')
        self.btn_login.clicked.connect(self.login)
        lay.addWidget(self.btn_login)

    @QtCore.pyqtSlot()
    def login(self):
        print('Hello')
        SecondTab.load_info()


class SecondTab(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(SecondTab, self).__init__(parent)
        lay = QVBoxLayout(self)

        # Choice Boxes
        layout_choice_boxes = QHBoxLayout()

        self.list_of_items = QtWidgets.QListView()
        self.model_dist = QtGui.QStandardItemModel(self.list_of_items)
        layout_choice_boxes.addWidget(self.list_of_items)

        # Load data button.
        self.loadData = QPushButton('Load Data')
        self.loadData.clicked.connect(self.load_info)

        # Add all components to main layout.
        lay.addLayout(layout_choice_boxes)
        lay.addWidget(self.loadData)

    @QtCore.pyqtSlot()
    def load_info(self):
        for member in ['Item 1', 'Item 2', 'Item 3']:
            item = QtGui.QStandardItem(member)
            item.setCheckable(True)
            item.setEditable(False)
            check = Qt.Unchecked
            item.setCheckState(check)
            self.model_dist.appendRow(item)

        self.list_of_items.setModel(self.model_dist)


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
错误在类
Home()
中的行上,我试图从
SecondTab()调用该方法。
class:
SecondTab.load\u info()


load_info()方法在
SecondTab
类中使用
self
,因此我尝试像这样直接传入该类:
SecondTab.load_info(SecondTab())
,但是,它不起作用。

这是一个关于基本OOP问题的问题,您必须与实例(对象)交互,而不是与类交互(抽象)。因此解决方案是对象“tab1”和“tab2”之间的连接:

class主窗口(qtwidts.QWidget):
定义初始化(自身,父级):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
布局=QVBoxLayout(自身)
#初始化选项卡
tab_holder=qtwidts.QTabWidget()
tab1=Home()
tab2=SecondTab()
选项卡固定器添加选项卡(表1,“表1”)
tab_holder.addTab(tab2,‘tab2’)
layout.addWidget(选项卡固定器)
tab1.btn\u登录。点击。连接(tab2.load\u信息)
类主页(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
超级(家庭,自我)。\uuuu初始\uuuuu(家长)
lay=QVBoxLayout(自身)
self.btn_login=QPushButton('login'))

lay.addWidget(self.btn_login)
这是一个关于基本OOP问题的问题,您必须与实例(对象)交互,而不是与类(抽象)交互。因此解决方案是对象“tab1”和“tab2”之间的连接:

class主窗口(qtwidts.QWidget):
定义初始化(自身,父级):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
布局=QVBoxLayout(自身)
#初始化选项卡
tab_holder=qtwidts.QTabWidget()
tab1=Home()
tab2=SecondTab()
选项卡固定器添加选项卡(表1,“表1”)
tab_holder.addTab(tab2,‘tab2’)
layout.addWidget(选项卡固定器)
tab1.btn\u登录。点击。连接(tab2.load\u信息)
类主页(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
超级(家庭,自我)。\uuuu初始\uuuuu(家长)
lay=QVBoxLayout(自身)
self.btn_login=QPushButton('login'))
lay.addWidget(self.btn\u登录)
class MainWindow(QtWidgets.QWidget):
    def __init__(self, parent):
        super(MainWindow, self).__init__(parent)

        layout = QVBoxLayout(self)

        # Initialize Tabs
        tab_holder = QtWidgets.QTabWidget()
        tab1 = Home()
        tab2 = SecondTab()

        tab_holder.addTab(tab1, "Tab1")
        tab_holder.addTab(tab2, 'Tab2')
        layout.addWidget(tab_holder)

        tab1.btn_login.clicked.connect(tab2.load_info)


class Home(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Home, self).__init__(parent)
        lay = QVBoxLayout(self)

        self.btn_login = QPushButton('Login')
        lay.addWidget(self.btn_login)