亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 210 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號