gpt4 book ai didi

python-3.x - 如何以编程方式展开/折叠和选择树中的项目?

转载 作者:行者123 更新时间:2023-12-05 04:52:25 24 4
gpt4 key购买 nike

假设我在 Qt Designer 中添加了一个名为 treeView 的 TreeView 小部件,我正在使用此代码向其中添加一些项目:

class StandardItem(Qt.QStandardItem):
def __init__(self, txt='', font_size=11, set_bold=False, color=Qt.QColor(0, 0, 0)):
super().__init__()
fnt = Qt.QFont('Open Sans', font_size)
fnt.setBold(set_bold)
self.setEditable(False)
self.setForeground(color)
self.setFont(fnt)
self.setText(txt)


model = Qt.QStandardItemModel()
rootNode = model.invisibleRootItem()
A = StandardItem("A")
A.appendRows([StandardItem("1"),StandardItem("2"),StandardItem("3")])
B = StandardItem("B")
B.appendRows([StandardItem("1"),StandardItem("2")])
rootNode.appendRows([A,B])
self.treeView.setModel(model)

如何编写折叠/展开项目 A 的函数?我如何编写一个函数来选择项目 A,就好像它已被单击一样?我可能在文档中遗漏了一些内容。

最佳答案

扩展和选择是影响视觉部分的任务,因此必须通过视觉来处理。第一个任务是通过 setExpanded() 完成的方法和第二种使用 select() selectionModel() 的方法与 View 关联,在这两种情况下都使用与项目关联的 QModelIndex:

import sys
from PyQt5 import Qt


class StandardItem(Qt.QStandardItem):
def __init__(self, txt="", font_size=11, set_bold=False, color=Qt.QColor(0, 0, 0)):
super().__init__()
fnt = Qt.QFont("Open Sans", font_size)
fnt.setBold(set_bold)
self.setEditable(False)
self.setForeground(color)
self.setFont(fnt)
self.setText(txt)


class MainWindow(Qt.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)

self.treeView = Qt.QTreeView()
self.setCentralWidget(self.treeView)

self.model = Qt.QStandardItemModel()
rootNode = self.model.invisibleRootItem()
A = StandardItem("A")
A.appendRows([StandardItem("1"), StandardItem("2"), StandardItem("3")])
B = StandardItem("B")
B.appendRows([StandardItem("1"), StandardItem("2")])
rootNode.appendRows([A, B])

self.treeView.setModel(self.model)

index_A = A.index()

self.treeView.setExpanded(index_A, True)
self.treeView.selectionModel().select(index_A, Qt.QItemSelectionModel.Select)


def main():
app = Qt.QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()


if __name__ == "__main__":
main()

注意:

似乎index() QStandardItem 的函数有一个错误,因为它有时会为有效的 QStandardItem 返回无效的 QModelIndex。

print(A.child(0).index().isValid())

输出:

False

这是因为当添加 child 时,“A”不是模型的一部分,然后模型在这些 child 中为空,正如可以看到的那样。

print(A.child(0).model())

输出:

None

如果改为先将“A”添加到模型,然后再添加子项,则模型通过。

self.model = Qt.QStandardItemModel()
rootNode = self.model.invisibleRootItem()
A = StandardItem("A")
B = StandardItem("B")
rootNode.appendRows([A, B])

A.appendRows([StandardItem("1"), StandardItem("2"), StandardItem("3")])
B.appendRows([StandardItem("1"), StandardItem("2")])

print(A.child(0).model())
print(A.child(0).index().isValid())

输出:

<PyQt5.QtGui.QStandardItemModel object at 0x7fb40aa868b0>
True

在这种情况下,最好使用 indexFromItem() QStandardItemModel 方法:

self.treeView.selectionModel().select(
self.model.indexFromItem(A.child(0)), Qt.QItemSelectionModel.Select
)

关于python-3.x - 如何以编程方式展开/折叠和选择树中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66521941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com