如何取消选择QTreeWidget中的所有项目?

时间:2015-08-24 14:07:33

标签: qt pyqt

我已经尝试过我可以在网上遇到的所有建议,从设置标志到使用selectionModel

def DatabaseLoadWrapper(self,database, init):
    self.treeWidget.currentItemChanged.disconnect(self.updateStackedWidget)
    self.DatabaseLoad(database, init)
    self.treeWidget.clearSelection()
    self.treeWidget.setCurrentItem(self.treeWidget.findItems(self.selectedDatabase,Qt.MatchExactly|Qt.MatchRecursive)[0])
    self.treeWidget.currentItemChanged.connect(self.updateStackedWidget)

这是我的代码需要在QTreeWidget上强制选择的地方,我使用的代码都没有抛出任何错误,但也对选择没有影响。我最终得到了用户选择数据库1的地方,但我需要恢复为只选择数据库2:

Example

编辑:Tree Widget使用以下代码构建:

def setupMenu(self):
    self.DatabaseParent = QTreeWidgetItem(['Databases'])
    for item in NamesInDatabase():
        self.DatabaseParent.addChild(QTreeWidgetItem([item]))
    self.AverageParent = QTreeWidgetItem(['Averaged Database'])
    self.SortingParent = QTreeWidgetItem(['Waste Composition'])
    self.ResultParent = QTreeWidgetItem(['Results'])
    self.treeWidget.addTopLevelItem(self.DatabaseParent)
    self.treeWidget.addTopLevelItem(self.AverageParent)
    self.treeWidget.addTopLevelItem(self.SortingParent)
    self.treeWidget.addTopLevelItem(self.ResultParent)

它主要是添加数据库,平均数据库,垃圾压缩和数据库。结果,作为导航菜单的固定部分,然后使用保存文件中的数据库名称填充数据库的子项。

2 个答案:

答案 0 :(得分:1)

您的问题未能公开导致问题的部分代码。默认情况下,像您一样设置当前项目也会设置选择。因此,此代码正确地将选择设置为项目" b":

from PySide import QtCore,QtGui

if __name__ == '__main__':
    import sys
    qApp = QtGui.QApplication(sys.argv)
    treeWidget = QtGui.QTreeWidget()
    parent = QtGui.QTreeWidgetItem(['Databases'])
    items = []
    for item_text in ["a","b","c"]:
        item = QtGui.QTreeWidgetItem([item_text])
        items.append(item)
        parent.addChild(item)
    treeWidget.addTopLevelItem(parent)

    treeWidget.setCurrentItem(items[1])

    treeWidget.show()
    sys.exit(qApp.exec_())

但是,我怀疑你的项目中的其他地方的代码会影响到这一点。例如,如果您已将QTableWidget选择模型的选择模式设置为MultiSelection,则选择将变为累积:

from PySide import QtCore,QtGui

if __name__ == '__main__':
    import sys
    qApp = QtGui.QApplication(sys.argv)
    treeWidget = QtGui.QTreeWidget()
    parent = QtGui.QTreeWidgetItem(['Databases'])
    items = []
    for item_text in ["a","b","c"]:
        item = QtGui.QTreeWidgetItem([item_text])
        items.append(item)
        parent.addChild(item)
    treeWidget.addTopLevelItem(parent)

    treeWidget.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)

    treeWidget.setCurrentItem(items[0])
    treeWidget.setCurrentItem(items[2])

    treeWidget.show()

    sys.exit(qApp.exec_())

但是,这仍然无法解释您的问题,因为clearSelection调用应该在任何情况下都清除了前面的选择。需要进一步调试代码,例如检查包装函数和setCurrentItem是否在您声明时被调用。还要检查DatabaseLoadWrapper后的其他内容。

答案 1 :(得分:0)

在Pyside2中,这对我有用: 如果单击treewidget,则选择将被清除。

self.treeWidget.setSelectionMode(QtWidgets.QAbstractItemView.ContiguousSelection)