为了账号安全,请及时绑定邮箱和手机立即绑定

QStandardItemModel - 添加一行仅包含一个项目

QStandardItemModel - 添加一行仅包含一个项目

海绵宝宝撒 2024-01-15 15:21:21
再次:from PyQt5.QtWidgets import *from PyQt5.QtGui import QStandardItemModel, QStandardItemfrom PyQt5 import QtCoreimport PyQt5import sys, typesclass OrgItemModel( QStandardItemModel ):    def __init__( self, tree_view ):        super().__init__()        self.tree_view = tree_view        self.setHorizontalHeaderLabels( [ 'Tasks', 'Due date', 'Notes' ] )def configure( tree_view, main_window ):    tree_view.setModel( OrgItemModel( tree_view ) )    def load_from_list( self ):        new_model = OrgItemModel( self )        root_item = new_model.invisibleRootItem()        lines = [            'Europe ||| 2020-10-26 ||| some notes',            '==France ||| 2020-10-27 ||| some France notes',            '====Paris ||| --- ||| blah blah',            '==Germany |||  ||| ',            '==Italy ||| 2020-10-28 ||| some Italy notes',            '====Rome |||  ||| ',            '==Ireland ||| 2020-10-30 ||| blah blah',        ]我对QStandardItemModel方法insertRow和方法感到困惑appendRow。目前我的QTreeView模型中有 3 列。我正在迭代一个列表来重建树,基于列表中的缩进(在每个深度级别的行开头使用“==”)来表示树深度。列表中的每一行用字符串“ ||| ”分隔给定行上的三个项目的文本(我计划在某个时候实现 JSON 序列化)。当我将行文本拆分为“ ||| ”时,会生成 3 个字符串。如果第二个或第三个是空白字符串,这应该意味着该项目不应添加到模型中,即在树视图中,人们应该只看到树节点,并且其行的其余部分不应包含任何项目(即无效索引) )。...但我发现即使我只插入 1 个项目(而不是 3 个项目的列表),(有时)会在 的QTreeView模型的行中创建三个项目。并且index.isValid()在上面的检查行中始终返回True,即使它只是插入一项(在 col0 中)。在这种情况下,data_at_coordfor col1 和 col2 被打印为“None”。因此,在显示的视图中,我可以单击已完成此操作的行的 col1 或 col2,并找到一个空白的可编辑项目,并在检查时发现这些是有效的索引。它们不应该是:我的目的是添加一个新行,其中 col1 和 col2 中没有项目,只有 col0 中没有项目。当我运行上面的 MRE 时,“Rome”行的行为如下:您可以尝试单击 col1 和 col2,但没有任何反应。但“德国”行似乎表现得很奇怪:当我单击 col1 或 col2 时,我发现我正在编辑一个空白字符串。注意,如果实际上您使用new_model.appendRow而不是item.appendRow在结果方面存在差异:树构建算法没有按预期工作,并且“Rome”行现在也无法执行“应该”执行的操作,并且 col1 和 col2 是可编辑的空白字符串。
查看完整描述

1 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

该问题不是由appendRow 方法引起的,而是由未记录的行为引起的。似乎在树类型模型中,除了没有子节点产生这种意外行为的节点之外,所有节点始终具有相同数量的列。解决方法是在文本项中创建带有 Qt::NoItemFlags 标志的 QStandardItem,以便用户无法与它们交互:


import sys


from PyQt5.QtCore import QRect, Qt

from PyQt5.QtGui import QStandardItemModel, QStandardItem

from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeView, QWidget



class OrgItemModel(QStandardItemModel):

    def __init__(self, parent=None):

        super().__init__(parent)

        self.setHorizontalHeaderLabels(["Tasks", "Due date", "Notes"])



def configure_from_list(model, lines):

    def get_parent_item(depth):

        parent = model.invisibleRootItem()

        if depth == 0:

            return parent

        for _ in range(depth):

            if parent.hasChildren():

                parent = parent.child(parent.rowCount() - 1)

            else:

                it = QStandardItem()

                it.setFlags(Qt.NoItemFlags)

                parent.appendRow(it)

                parent = it

        return parent


    for line in lines:

        values = line.strip("=")

        depth = (len(line) - len(values)) // 2

        items = []

        for value in values.split("|||"):

            text = value.strip()

            item = QStandardItem()

            if text:

                item.setText(text)

            else:

                item.setFlags(Qt.NoItemFlags)

            items.append(item)

        parent_item = get_parent_item(depth)

        parent_item.appendRow(items)



class Ui_MainWindow(object):

    def setupUi(self, MainWindow):

        MainWindow.resize(1100, 580)

        self.centralwidget = QWidget(MainWindow)

        self.treeView = QTreeView(self.centralwidget)

        self.treeView.setGeometry(QRect(20, 20, 1000, 320))

        MainWindow.setCentralWidget(self.centralwidget)



class MyWindow(QMainWindow):

    def __init__(self):

        super(MyWindow, self).__init__()

        self.ui = Ui_MainWindow()

        self.ui.setupUi(self)


        lines = [

            "Europe ||| 2020-10-26 ||| some notes",

            "==France ||| 2020-10-27 ||| some France notes",

            "====Paris ||| --- ||| blah blah",

            "==Germany |||  ||| ",

            "==Italy ||| 2020-10-28 ||| some Italy notes",

            "====Rome |||  ||| ",

            "==Ireland ||| 2020-10-30 ||| blah blah",

        ]

        model = OrgItemModel()

        self.ui.treeView.setModel(model)

        configure_from_list(model, lines)

        self.ui.treeView.expandAll()



app = QApplication(sys.argv)

application = MyWindow()

application.show()

sys.exit(app.exec())



查看完整回答
反对 回复 2024-01-15
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信