【问题标题】:How to hide checkboxes in a QTableView using python?如何使用python隐藏QTableView中的复选框?
【发布时间】:2015-06-20 11:48:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: python qt checkbox pyqt5 qabstracttablemodel


    【解决方案1】:

    嗯,我想我可以自己解决这个问题。 QTableView 的复选框的秘密不在于 flag 方法,而是与 data-method 的返回值有关。 QAbstractItemModeldescription of the data method 解释说,对于那些您不想处理的情况,您应该返回无效的 QVariant。在 PyQt4.11 中,这意味着您必须返回 python 的 None 值,因为 None is interpretated as invalid 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()])
    

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

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

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        • 2013-08-01
        • 1970-01-01
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多