3

我对 python 和 Qt 都很陌生。我想使用QTableViewtableview 的单元格中出现的不带复选框,但似乎它们只是默认出现在那里。正如我到目前为止发现的那样,您只需停用该Qt.ItemIsUserCheckable标志。但是我该怎么做呢?我尝试以这种方式在派生模型类中使用QAbstractItemModel l的标志 - 函数:QAbstractTableModel

def flags(self,index):
        return(QtCore.Qt.ItemIsEnabled| QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable)

所以,我所做的是:只是不返回Qt.ItemIsUserCheckable标志。这适用于例如Qt.ItemIsEditable使单元格可编辑或不可编辑的标志(当它未返回时),但使用ItemIsUserCheckable标志执行此操作对复选框没有影响。所以我的问题是:我怎样才能摆脱使用 python 的复选框?请帮忙!

4

2 回答 2

4

嗯,我想我可以自己解决这个问题。QTableView 复选框的秘密不在于 flag 方法,而是与 data-method 的返回值相关。的data 方法的描述解释说,对于那些你不想处理的情况QAbstractItemModel,你应该返回一个 invalid 。QVariant在 PyQt4.11 中,这意味着您必须返回 python 的None值,因为None 被解释为无效的 QVariant。所以我所要做的就是确保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()])

请注意,代码返回NoneQt.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()])

一个 string( "") 返回Qt.CheckStateRole当然不是无效的QVariant。并且 -surprise,surprise - 复选框显示在 TableView 内。另一点是所有这些都可以在没有实现我上面提到的标志方法的情况下工作。

于 2015-04-15T21:19:47.947 回答
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 。

但请注意,您确实将 None 返回给所有角色,但您在 data 方法中处理的角色除外,并且不要像使用一些简洁和笨拙的逻辑那样返回 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
于 2021-04-01T10:22:02.863 回答