我对python和Qt都很陌生。我想在tableview的单元格中使用QTableView
没有复选框,但是看起来它们只是默认出现在那里。至于我found out 到目前为止,你只需要停用Qt.ItemIsUserCheckable
标志。但是我该怎么做呢?我尝试以这种方式在QAbstractTableModel
派生的模型类中使用QAbstractItemModel l的flags - function函数:
def flags(self,index):
return(QtCore.Qt.ItemIsEnabled| QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable)
所以,我做的是:只是不返回Qt.ItemIsUserCheckable
标志。这很好用,例如对于Qt.ItemIsEditable
标志,使单元格可编辑或不可编辑(如果未返回),但使用ItemIsUserCheckable
标志执行此操作对复选框没有影响。所以我的问题是:如何使用python摆脱复选框?请帮忙!
答案 0 :(得分:3)
好吧,我想我可以自己解决这个问题。 QTableView复选框的秘密不在于flag方法,而是与data-method的返回值相关。 QAbstractItemModel
的{{3}}解释说,对于那些您不想处理的案例,您应该返回无效的QVariant
。在PyQt4.11中,这意味着您必须返回python的None
值,因为description of the data method。所以我所要做的就是确保当我不想处理角色时数据方法返回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()])
请注意,代码为None
返回Qt.CheckStateRole
,因为此角色对代码不感兴趣,并且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()])
为""
返回一个字符串(Qt.CheckStateRole
),当然这不是无效QVariant
。而-surprise,surprise - 复选框显示在TableView中。
另一点是,所有这些都可以在不实现上面提到的标志方法的情况下工作。
答案 1 :(得分:0)
这个问题也出现在 PyQt5 中:QAbstractTableModel 的数据方法必须返回 None,除非它处理特定的角色。
因此,当您实例化模型表视图时,您可能用于赋予每个单元格属性(例如复选框、字体、对齐方式等)的每个可能角色都会调用视图的数据方法。它使用该调用来确定是否需要帮助创建单元格。如果在查询该方法时,它被告知 None,则它什么都不做。
这应该不是问题,因为如果让 Python 方法运行到最后,它们会返回 None。
因此,模型视图旨在简单地显示由(行、列)寻址的每个单元格中的数据,在编写数据方法时只需满足特定的显示角色就足够了。
def data( self, index, role ):
if role == Qt.DisplayRole:
return self.mymodeldata[ index.row() ][ index.column() ]
许多其他可能的角色也都调用了 data 方法并获得 None 作为回报。值得庆幸的是,您不必专门针对每个人都说 None。
但是请注意,除了在 data 方法中处理的角色之外,您确实向所有角色返回 None ,并且不要像使用一些简洁而笨拙的逻辑那样返回 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