【发布时间】:2015-02-19 22:14:17
【问题描述】:
下面的代码创建由self.myModel (QAbstractTableModel) 驱动的QTableView。
“显示全部”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_())
【问题讨论】:
-
在一种情况下设置空模型,在另一种情况下设置数据模型?视图将自动更新。
-
请举个例子
-
在使用复选框打开和关闭项目的情况下,分配一个空的“虚拟”模型可能会起作用。但是,如果假设我们想使用复选框在奇数和偶数项目编号之间切换,那么空模型方法将无法解决问题......
-
我同意我必须更具体地说明需要实现的目标。
-
回到主题。当我们想要在复选框为ON时显示奇数项目而在复选框为OFF(未选中)时显示偶数项目时,我们应该如何处理?
标签: python qt pyqt pyside qtableview