【问题标题】:QAbstractItemModel set check state automaticallyQAbstractItemModel 自动设置检查状态
【发布时间】:2015-11-08 05:51:51
【问题描述】:

我正在尝试自动检查 QTreeView 中的节点(例如,当用户加载一些数据时)。手动复选框勾选功能工作正常。我根据http://rowinggolfer.blogspot.com.au/2010/05/qtreeview-and-qabractitemmodel-example.html 搜索树中的相关项目,即:

在模型中:

def searchModel(self, person):
    def searchNode(node):
        for child in node.childItems:
            if person == child.person:
                index = self.createIndex(child.row(), 0, child)
                return index

            if child.childCount() > 0:
                result = searchNode(child)
                if result:
                    return result

    node_index = searchNode(self.parents[0])
    return node_index

def find_GivenName(self, fname):
    app = None
    for person in self.people:
        if person.fname == fname:
            app = person
            break
    if app != None:
        index = self.searchModel(app)
        return (True, index)            
    return (False, None)

然后我将相关节点传递给模型以设置其检查状态,例如

model.setData(node_index, 2, QtCore.Qt.CheckStateRole)

在模型中:

def setData(self, index, value, role):
    if role == Qt.CheckStateRole:
        row = index.row()
        self.args[row].checked = value            
    return True

但未选中相关节点的复选框。有什么想法吗?

【问题讨论】:

    标签: qt pyqt pyqt4


    【解决方案1】:

    复选框被选中,但仅当鼠标移到相关节点上时。根据 pyqt 文档-'在重新实现 setData() 函数时,必须显式发出 dataChanged() 信号'http://pyqt.sourceforge.net/Docs/PyQt4/qabstractitemmodel.html#dataChanged。我将模型中的 setData 方法更改为:

    def setData(self, index, value, role):
        if role == Qt.CheckStateRole:
            row = index.row()
            self.args[row].checked = value  
            self.dataChanged.emit(index, index)
    return True
    

    这里有一些关于 dataChanged() 信号的好信息:When to emit dataChanged from a QAbstractItemModel

    【讨论】:

      猜你喜欢
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2010-09-29
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2022-12-13
      相关资源
      最近更新 更多