如何使用 python 隐藏 QTableView 中的复选框?
How to hide checkboxes in a QTableView using python?
我对 python 和 Qt 都很陌生。我想使用 QTableView
而没有复选框出现在 tableview 的单元格中,但看起来它们只是默认出现在那里。正如我在 QAbstractTableModel
派生模型 class 中 found out so far, you just have to deactivate the Qt.ItemIsUserCheckable
flag. But how am I supposed to do this? I tried to use the flags - function of the QAbstractItemModell 这样:
def flags(self,index):
return(QtCore.Qt.ItemIsEnabled| QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable)
所以,我所做的是:只是不返回 Qt.ItemIsUserCheckable
标志。这很好用,例如对于 Qt.ItemIsEditable
标志是否使单元格可编辑(当它未返回时)但使用 ItemIsUserCheckable
标志执行此操作对复选框没有影响。所以我的问题是:如何使用 python 摆脱复选框?请帮忙!
好吧,我想我可以自己解决这个问题。 QTableView 复选框的秘密不在于标志方法,而是与数据方法的 return 值相关。 description of the data method of QAbstractItemModel
explains that you should return an invalid QVariant
for those cases you donn't want to handle. In PyQt4.11 this means that you have to return python's None
value, because None is interpretated as invalid QVariant。所以我所要做的就是确保数据方法 returns None
当我不想处理角色时:
# works for python 3.4 and PyQt4.11
def data(self,index,role):
if not index.isValid():
return(None)
# for all roles you're not interested in, do nothing: i.e. return python's None which is interpreted as an invalid QVariant value
elif role != QtCore.Qt.DisplayRole:
return(None)
else:
return(self.data[index.row()][index.column()])
请注意,Qt.CheckStateRole
的代码 returns None
作为此角色与代码无关,并且 GUI 中不显示任何复选框。
现在,如果您像这样更改数据方法:
def data(self,index,role):
if not index.isValid():
return(None)
elif role == QtCore.Qt.CheckStateRole:
return("")
elif role != QtCore.Qt.DisplayRole:
return(None)
else:
return(self.data[index.row()][index.column()])
一个字符串 (""
) 被 returned 用于 Qt.CheckStateRole
,这当然不是无效的 QVariant
。而且 - 惊喜,惊喜 - 复选框显示在 TableView 中。
另一点是所有这些都可以在没有实现我上面提到的标志方法的情况下工作。
PyQt5 也会出现这种情况:QAbstractTableModel 的数据方法必须 return None 除非它处理特定角色。
因此,当您实例化一个模型 table 视图时,您可能会使用的每个可能的角色来赋予每个单元格属性(例如复选框、字体、对齐方式等)调用视图的数据方法。它使用该调用来确定是否需要帮助创建单元格。如果在查询该方法时,它被告知 None,它什么都不做。
这应该不是问题,因为 Python 方法 return None 如果你让它们 运行 结束。
因此,模型视图旨在简单地显示由(行,列)寻址的每个单元格中的数据,在编写数据方法时只需满足该特定显示角色就足够了。
def data( self, index, role ):
if role == Qt.DisplayRole:
return self.mymodeldata[ index.row() ][ index.column() ]
许多其他可能的角色也各自调用数据方法并在 return 中获得 None。值得庆幸的是,您不必专门针对每个人None。
但是请注意,您对所有角色执行 return None,但您在数据方法中处理的角色除外,而不是 return,比如说,False,因为您会有一些简洁而笨拙的逻辑,例如:
def data( self, index, role ):
return role == Qt.DisplayRole and self.mymodelData[ index.row() ][ index.column() ]
在这种情况下,其他所有角色都会被告知 False。当 CheckStateRole 来敲门并被告知 False 时,它会适当地显示空复选框。
这将解决所有没有此类错误的情况:
def data( self, index, role ):
return role == Qt.DisplayRole and self.mymodelData[ index.row() ][ index.column() ] or None
我对 python 和 Qt 都很陌生。我想使用 QTableView
而没有复选框出现在 tableview 的单元格中,但看起来它们只是默认出现在那里。正如我在 QAbstractTableModel
派生模型 class 中 found out so far, you just have to deactivate the Qt.ItemIsUserCheckable
flag. But how am I supposed to do this? I tried to use the flags - function of the QAbstractItemModell 这样:
def flags(self,index):
return(QtCore.Qt.ItemIsEnabled| QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable)
所以,我所做的是:只是不返回 Qt.ItemIsUserCheckable
标志。这很好用,例如对于 Qt.ItemIsEditable
标志是否使单元格可编辑(当它未返回时)但使用 ItemIsUserCheckable
标志执行此操作对复选框没有影响。所以我的问题是:如何使用 python 摆脱复选框?请帮忙!
好吧,我想我可以自己解决这个问题。 QTableView 复选框的秘密不在于标志方法,而是与数据方法的 return 值相关。 description of the data method of QAbstractItemModel
explains that you should return an invalid QVariant
for those cases you donn't want to handle. In PyQt4.11 this means that you have to return python's None
value, because None is interpretated as invalid QVariant。所以我所要做的就是确保数据方法 returns None
当我不想处理角色时:
# works for python 3.4 and PyQt4.11
def data(self,index,role):
if not index.isValid():
return(None)
# for all roles you're not interested in, do nothing: i.e. return python's None which is interpreted as an invalid QVariant value
elif role != QtCore.Qt.DisplayRole:
return(None)
else:
return(self.data[index.row()][index.column()])
请注意,Qt.CheckStateRole
的代码 returns None
作为此角色与代码无关,并且 GUI 中不显示任何复选框。
现在,如果您像这样更改数据方法:
def data(self,index,role):
if not index.isValid():
return(None)
elif role == QtCore.Qt.CheckStateRole:
return("")
elif role != QtCore.Qt.DisplayRole:
return(None)
else:
return(self.data[index.row()][index.column()])
一个字符串 (""
) 被 returned 用于 Qt.CheckStateRole
,这当然不是无效的 QVariant
。而且 - 惊喜,惊喜 - 复选框显示在 TableView 中。
另一点是所有这些都可以在没有实现我上面提到的标志方法的情况下工作。
PyQt5 也会出现这种情况:QAbstractTableModel 的数据方法必须 return None 除非它处理特定角色。
因此,当您实例化一个模型 table 视图时,您可能会使用的每个可能的角色来赋予每个单元格属性(例如复选框、字体、对齐方式等)调用视图的数据方法。它使用该调用来确定是否需要帮助创建单元格。如果在查询该方法时,它被告知 None,它什么都不做。
这应该不是问题,因为 Python 方法 return None 如果你让它们 运行 结束。
因此,模型视图旨在简单地显示由(行,列)寻址的每个单元格中的数据,在编写数据方法时只需满足该特定显示角色就足够了。
def data( self, index, role ):
if role == Qt.DisplayRole:
return self.mymodeldata[ index.row() ][ index.column() ]
许多其他可能的角色也各自调用数据方法并在 return 中获得 None。值得庆幸的是,您不必专门针对每个人None。
但是请注意,您对所有角色执行 return None,但您在数据方法中处理的角色除外,而不是 return,比如说,False,因为您会有一些简洁而笨拙的逻辑,例如:
def data( self, index, role ):
return role == Qt.DisplayRole and self.mymodelData[ index.row() ][ index.column() ]
在这种情况下,其他所有角色都会被告知 False。当 CheckStateRole 来敲门并被告知 False 时,它会适当地显示空复选框。
这将解决所有没有此类错误的情况:
def data( self, index, role ):
return role == Qt.DisplayRole and self.mymodelData[ index.row() ][ index.column() ] or None