我过去曾使用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
答案 0 :(得分:0)
要选择特定模型索引的所有子项,您需要执行以下操作。
1)启用多项选择 self.view.SetSelectionMode(QAbstractItemView中::多项选择)
2)使用'rowcount'和'index'方法遍历树
3)使用选择模型对模型索引进行选择 self.view.SelectionModel()。选择(qmodelindex,QItemSelectionModel.Select)
P.S:我在c ++ api上工作,因此案例和语法可能会有错误