Python 从第二个类调用方法以更新QListView数据
我有两个选项卡,选项卡1和选项卡2。在Tab2上,有一个按钮,单击该按钮时会调用更新同一选项卡中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
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)