PyQt4:如何使用Qt.ItemIsTristate自动选择具有QTreeView的子项?

时间:2017-07-20 19:34:43

标签: python pyqt4 pyside qtreeview

我过去曾使用Qt.ItemIsTristate标志和QTreeWidget在用户选择项目时自动选择子项。

以下是QTreeWidget的示例:

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt

class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        self.tree = QtGui.QTreeWidget()

        for k in range(0, 4):
            parent = self.tree

            for i in range(0, 4):
                item = QtGui.QTreeWidgetItem(parent)
                item.setText(0, "item %d %d" % (k, i) )
                item.setFlags(item.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
                item.setCheckState(0, Qt.Unchecked)

                parent = item

        self.tree.expandToDepth(4)

        self.setCentralWidget(self.tree)
        self.resize(200, 300)

def main():
    app = QtGui.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

使用此代码,检查项目时,还会检查其所有子项。

现在,我需要使用QTreeView做同样的事情。 我测试了以下代码:

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt

class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        self.model = QtGui.QStandardItemModel()

        for k in range(0, 4):
            parentItem = self.model.invisibleRootItem()
            for i in range(0, 4):
                item = QtGui.QStandardItem("item %d %d" % (k,i) )
                item.setFlags(item.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
                item.setCheckState( Qt.Unchecked)

                parentItem.appendRow(item)
                parentItem = item

        self.view = QtGui.QTreeView()
        self.view.setModel(self.model)
        self.view.expandToDepth(4)

        self.setCentralWidget(self.view)
        self.resize(200, 300)

def main():
    app = QtGui.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

使用此代码,当选中某个项目时,不会检查其子项。

您是否有任何提示将QTreeView / QStandardItem版本设置为与第一个示例一样的工作?

我正在使用PyQt4 4.11。

祝你好运, Elby

1 个答案:

答案 0 :(得分:0)

要选择特定模型索引的所有子项,您需要执行以下操作。

1)启用多项选择 self.view.SetSelectionMode(QAbstractItemView中::多项选择)

2)使用'rowcount'和'index'方法遍历树

3)使用选择模型对模型索引进行选择 self.view.SelectionModel()。选择(qmodelindex,QItemSelectionModel.Select)

P.S:我在c ++ api上工作,因此案例和语法可能会有错误