如何使用python隐藏QTableView中的复选框?

时间:2015-04-14 18:16:30

标签: python qt checkbox qabstracttablemodel

我对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摆脱复选框?请帮忙!

2 个答案:

答案 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