Python 当QTableView由模型驱动时,如何刷新它
下面的代码创建了由Python 当QTableView由模型驱动时,如何刷新它,python,qt,pyqt,pyside,qtableview,Python,Qt,Pyqt,Pyside,Qtableview,下面的代码创建了由self.myModel驱动的QTableView(QAbstractTableModel)。 “全部显示”self.checkBox链接到self.myModel.cbChanged()方法 问题:如何修改此代码,以便选中复选框后立即刷新“QTableView” 目标:选中复选框时,我们希望显示奇数项。以及要隐藏的偶数项。 当复选框关闭(未选中)时,我们希望显示偶数项。所有奇数编号的项目都将隐藏 import sys, os from PyQt4 import QtCore
self.myModel
驱动的QTableView
(QAbstractTableModel
)。
“全部显示”self.checkBox
链接到self.myModel.cbChanged()
方法
问题:如何修改此代码,以便选中复选框后立即刷新“QTableView”
目标:选中复选框时,我们希望显示奇数项。以及要隐藏的偶数项。
当复选框关闭(未选中)时,我们希望显示偶数项。所有奇数编号的项目都将隐藏
import sys, os
from PyQt4 import QtCore, QtGui
app=QtGui.QApplication(sys.argv)
class TableModel(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items=['One','Two','Three','Four','Five','Six','Seven']
self.cb_status=True
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.items)
def columnCount(self, index=QtCore.QModelIndex()):
return 1
def data(self, index, role):
if not index.isValid() or not (0<=index.row()<len(self.items)):
return QtCore.QVariant()
item=str(self.items[index.row()])
if role==QtCore.Qt.DisplayRole and self.cb_status:
return item
else:
return QtCore.QVariant()
def cbChanged(self, arg=None):
self.cb_status=arg
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
mainLayout=QtGui.QHBoxLayout()
self.setLayout(mainLayout)
self.viewA=QtGui.QTableView()
self.viewA.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
self.myModel=TableModel()
self.viewA.setModel(self.myModel)
self.checkBox=QtGui.QCheckBox("Show All")
self.checkBox.stateChanged.connect(self.myModel.cbChanged)
self.checkBox.setChecked(self.myModel.cb_status)
mainLayout.addWidget(self.viewA)
mainLayout.addWidget(self.checkBox)
self.show()
view=Window()
sys.exit(app.exec_())
导入系统,操作系统
从PyQt4导入QtCore、QtGui
app=QtGui.QApplication(sys.argv)
类TableModel(QtCore.QAbstractTableModel):
定义初始化(自):
QtCore.QAbstractTableModel.\uuuu init\uuuu(self)
self.items=['1','2','3','4','5','6','7']
self.cb_status=True
def行数(self,parent=QtCore.QModelIndex()):
返回len(自我项目)
def columnCount(self,index=QtCore.QModelIndex()):
返回1
def数据(自身、索引、角色):
如果不是index.isValid(),则(0为此,您可以使用
QSortFilterProxyModel
类。这样,我们就不会篡改实际源模型的结构或数据。我们只需将主源映射到该代理模型,视图使用该代理模型来显示过滤/排序的数据。我们可以随意影响代理模型中的数据,而不会有篡改的风险源模型
以下是修改后的源代码,以使用:
import sys, os
from PyQt4 import QtCore, QtGui
app=QtGui.QApplication(sys.argv)
class TableModel(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items=['One','Two','Three','Four','Five','Six','Seven']
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.items)
def columnCount(self, index=QtCore.QModelIndex()):
return 1
def data(self, index, role):
if not index.isValid() or not (0<=index.row()<len(self.items)):
return QtCore.QVariant()
item=str(self.items[index.row()])
if role==QtCore.Qt.DisplayRole:
return item
else:
return QtCore.QVariant()
class MySortFilterProxyModel(QtGui.QSortFilterProxyModel):
def __init__(self):
super(MySortFilterProxyModel, self).__init__()
self.cb_status=True
def cbChanged(self, arg=None):
self.cb_status=arg
print self.cb_status
self.invalidateFilter()
def filterAcceptsRow(self, sourceRow, sourceParent):
print_when_odd_flag = self.cb_status
is_odd = True
index = self.sourceModel().index(sourceRow, 0, sourceParent)
print "My Row Data: %s" % self.sourceModel().data(index, role=QtCore.Qt.DisplayRole)
if (sourceRow + 1) % 2 == 0:
is_odd = False
if print_when_odd_flag:
if is_odd:
return True
else:
return False
else:
if not is_odd:
return True
else:
return False
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
mainLayout=QtGui.QHBoxLayout()
self.setLayout(mainLayout)
self.viewA=QtGui.QTableView()
self.viewA.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
self.myModel=TableModel()
self.sortModel = MySortFilterProxyModel()
self.sortModel.setSourceModel(self.myModel)
self.viewA.setModel(self.sortModel)
self.checkBox=QtGui.QCheckBox("Show All")
self.checkBox.stateChanged.connect(self.sortModel.cbChanged)
self.checkBox.setChecked(self.sortModel.cb_status)
mainLayout.addWidget(self.viewA)
mainLayout.addWidget(self.checkBox)
self.show()
view=Window()
sys.exit(app.exec_())
导入系统,操作系统
从PyQt4导入QtCore、QtGui
app=QtGui.QApplication(sys.argv)
类TableModel(QtCore.QAbstractTableModel):
定义初始化(自):
QtCore.QAbstractTableModel.\uuuu init\uuuu(self)
self.items=['1','2','3','4','5','6','7']
def行数(self,parent=QtCore.QModelIndex()):
返回len(自我项目)
def columnCount(self,index=QtCore.QModelIndex()):
返回1
def数据(自身、索引、角色):
如果不是index.isValid(),则(0为此,您可以使用
QSortFilterProxyModel
类。这样,我们就不会篡改实际源模型的结构或数据。我们只需将主源映射到该代理模型,视图使用该代理模型来显示过滤/排序的数据。我们可以随意影响代理模型中的数据,而不会有篡改的风险源模型
以下是修改后的源代码,以使用:
import sys, os
from PyQt4 import QtCore, QtGui
app=QtGui.QApplication(sys.argv)
class TableModel(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items=['One','Two','Three','Four','Five','Six','Seven']
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.items)
def columnCount(self, index=QtCore.QModelIndex()):
return 1
def data(self, index, role):
if not index.isValid() or not (0<=index.row()<len(self.items)):
return QtCore.QVariant()
item=str(self.items[index.row()])
if role==QtCore.Qt.DisplayRole:
return item
else:
return QtCore.QVariant()
class MySortFilterProxyModel(QtGui.QSortFilterProxyModel):
def __init__(self):
super(MySortFilterProxyModel, self).__init__()
self.cb_status=True
def cbChanged(self, arg=None):
self.cb_status=arg
print self.cb_status
self.invalidateFilter()
def filterAcceptsRow(self, sourceRow, sourceParent):
print_when_odd_flag = self.cb_status
is_odd = True
index = self.sourceModel().index(sourceRow, 0, sourceParent)
print "My Row Data: %s" % self.sourceModel().data(index, role=QtCore.Qt.DisplayRole)
if (sourceRow + 1) % 2 == 0:
is_odd = False
if print_when_odd_flag:
if is_odd:
return True
else:
return False
else:
if not is_odd:
return True
else:
return False
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
mainLayout=QtGui.QHBoxLayout()
self.setLayout(mainLayout)
self.viewA=QtGui.QTableView()
self.viewA.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
self.myModel=TableModel()
self.sortModel = MySortFilterProxyModel()
self.sortModel.setSourceModel(self.myModel)
self.viewA.setModel(self.sortModel)
self.checkBox=QtGui.QCheckBox("Show All")
self.checkBox.stateChanged.connect(self.sortModel.cbChanged)
self.checkBox.setChecked(self.sortModel.cb_status)
mainLayout.addWidget(self.viewA)
mainLayout.addWidget(self.checkBox)
self.show()
view=Window()
sys.exit(app.exec_())
导入系统,操作系统
从PyQt4导入QtCore、QtGui
app=QtGui.QApplication(sys.argv)
类TableModel(QtCore.QAbstractTableModel):
定义初始化(自):
QtCore.QAbstractTableModel.\uuuu init\uuuu(self)
self.items=['1','2','3','4','5','6','7']
def行数(self,parent=QtCore.QModelIndex()):
返回len(自我项目)
def columnCount(self,index=QtCore.QModelIndex()):
返回1
def数据(自身、索引、角色):
如果不是index.isValid()或不是(0在一种情况下设置空模型,在另一种情况下设置带数据的模型?视图将自动更新。发布示例请签名一个空的“虚拟”模型可能会在使用复选框打开和关闭项目的情况下工作。但是,如果我们想使用复选框在奇数和偶数项目编号之间切换,空模型方法不会起作用……我同意我必须更具体地说明需要实现什么。但是回到主题。我们应该如何处理siTunes当我们想显示带有复选框的奇数项目时,复选框处于打开状态,而带有复选框的偶数项目处于关闭状态时(未选中)?在一种情况下设置空模型,在另一种情况下设置带有数据的模型?视图将自动更新。发布示例请签名空“虚拟”模型可能会在使用复选框打开和关闭项目的情况下工作。但是,如果我们想使用复选框在奇数和偶数项目编号之间切换,空模型方法不会起作用……我同意我必须更具体地说明需要实现什么。但是回到主题。我们应该如何处理s当我们想要显示带有复选框的奇数项目时,iTunes处于启用状态,而当复选框处于禁用状态时,显示偶数项目时,iTunes处于禁用状态(未选中)?感谢澄清!感谢澄清!