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())
添加回答
舉報