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

再次:


from PyQt5.QtWidgets import *

from PyQt5.QtGui import QStandardItemModel, QStandardItem

from PyQt5 import QtCore

import PyQt5

import sys, types


class 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在结果方面存在差异:

  1. 树构建算法没有按预期工作,并且

  2. “Rome”行现在也无法执行“应该”执行的操作,并且 col1 和 col2 是可编辑的空白字符串。


海绵宝宝撒
浏览 114回答 1
1回答

九州编程

该问题不是由appendRow 方法引起的,而是由未记录的行为引起的。似乎在树类型模型中,除了没有子节点产生这种意外行为的节点之外,所有节点始终具有相同数量的列。解决方法是在文本项中创建带有 Qt::NoItemFlags 标志的 QStandardItem,以便用户无法与它们交互:import sysfrom PyQt5.QtCore import QRect, Qtfrom PyQt5.QtGui import QStandardItemModel, QStandardItemfrom PyQt5.QtWidgets import QApplication, QMainWindow, QTreeView, QWidgetclass 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())
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python