【问题标题】:What's the proper way to associate data with a PyQt5 QTreeWidgetItem将数据与 PyQt5 QTreeWidgetItem 关联的正确方法是什么
【发布时间】:2018-06-29 03:08:32
【问题描述】:

我正在使用类似于 Macintosh Finder 的 PyQT5 QTreeWidget 构建文件树浏览器。 (奇怪的是,好像没有。)

我想将信息与每个 QTreeWidgetItem 关联起来。这是显示的字符串之外的信息。

这样做的正确方法是什么?到目前为止,我想出了:

  1. 子类 QTreeWidgetItem 并添加我自己的实例变量。
  2. 以某种方式将信息填充到模型中,但我不完全确定该怎么做。也许我需要继承QAbstractItemModel?
  3. 在 QTreeWidgetItems 和我的附加信息之间创建一个关联数组? (似乎是个非常糟糕的主意。)

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:
    1. 子类 QTreeWidgetItem 并添加我自己的实例变量

    根据docs:

    子类化

    当子类化 QTreeWidgetItem 以提供自定义项时, 可以为它们定义新类型,以便它们可以 区别于标准品。子类的构造函数 需要此功能的需要调用基类构造函数 等于或大于UserType 的新类型值。

    因此,如果您想要做一些可维护的事情并且想要使用QTreeWidget,那么这个选项是合适的,因为它允许具有模块化。

    1. 以某种方式将信息填充到模型中,但我不完全确定该怎么做。也许我需要继承QAbstractItemModel?

    根据类的定义:QTreeWidget类提供了一个使用预定义树模型的树视图

    这意味着该类不能放置自定义模型,此功能的优点是易于使用,因为您不必使用较低级别的元素,缺点:您不能自定义模型。

    1. 在QTreeWidgetItems 和我的附加信息之间创建一个关联数组? (似乎是个非常糟糕的主意。)

    您可以通过void QTreeWidgetItem::setData(int column, int role, const QVariant &value)方法添加一些值,并通过QVariant QTreeWidgetItem::data(int column, int role) const恢复它们。

    当您想向项目添加信息时建议使用此方法,但它不可扩展。

    答案将是第一个选项,但对于此类任务,我不建议使用QTreeWidget,因为它有不必要的元素导致内存消耗增加和速度降低,使用QTreeView 是合适的并创建一个自定义模型,但如果你想显示本地文件的信息,已经有一个实现它的模型:QFileSystemModel。

    例子:

    import sys
    
    from PyQt5.QtWidgets import *
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = QTreeView()
        model = QFileSystemModel()
        model.setRootPath("")
        w.setModel(model)
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-29
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多