如何添加 qtreeview 子项
Posted
技术标签:
【中文标题】如何添加 qtreeview 子项【英文标题】:How do I add qtreeview sub items 【发布时间】:2016-10-05 15:28:27 【问题描述】:如何在下面提供的代码中将子项添加到我当前的 qtreeview 项目中?我希望它看起来像这样:
下面的代码创建了一个已排序的树视图,但我并不完全清楚如何添加子项。希望你能帮忙,谢谢。
import sys
from PySide import QtGui, QtCore
class SortModel(QtGui.QSortFilterProxyModel):
def __init__(self, *args, **kwargs):
super(SortModel, self).__init__(*args, **kwargs)
def lessThan(self, left, right):
leftData = self.sourceModel().data(left)
rightData = self.sourceModel().data(right)
if leftData:
leftData = leftData.lower()
if rightData:
rightData = rightData.lower()
print('L:', leftData, 'R:', rightData)
return leftData < rightData
class Browser(QtGui.QDialog):
def __init__(self, parent=None):
super(Browser, self).__init__(parent)
self.initUI()
def initUI(self):
self.resize(200, 300)
self.setWindowTitle('Assets')
self.setModal(True)
self.results = ""
self.uiItems = QtGui.QTreeView()
self.uiItems.setAlternatingRowColors(True)
self.uiItems.setSortingEnabled(True)
self.uiItems.sortByColumn(0, QtCore.Qt.AscendingOrder)
self.uiItems.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
self.uiItems.header().setResizeMode(QtGui.QHeaderView.ResizeToContents)
self._model = self.create_model(self)
self._spmodel = SortModel(self)
self._spmodel.setSourceModel(self._model)
self._spmodel.setDynamicSortFilter(True)
self.uiItems.setModel(self._spmodel)
grid = QtGui.QGridLayout()
grid.setContentsMargins(0, 0, 0, 0)
grid.addWidget(self.uiItems, 0, 0)
self.setLayout(grid)
self.setLayout(grid)
self.uiItems.doubleClicked.connect(self.doubleClickedItem)
self.show()
def doubleClickedItem(self, item):
name = item.data(role=QtCore.Qt.DisplayRole)
print name
def create_model(self, parent):
items = [
'Cookie dough',
'Hummus',
'Spaghetti',
'Dal makhani',
'Chocolate whipped cream'
]
model = QtGui.QStandardItemModel()
model.setHorizontalHeaderLabels(['Name'])
for item in items:
model.appendRow(QtGui.QStandardItem(item))
return model
def showEvent(self, event):
geom = self.frameGeometry()
geom.moveCenter(QtGui.QCursor.pos())
self.setGeometry(geom)
super(Browser, self).showEvent(event)
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
# self.hide()
self.close()
event.accept()
else:
super(Browser, self).keyPressEvent(event)
def main():
app = QtGui.QApplication(sys.argv)
ex = Browser()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
【问题讨论】:
【参考方案1】:您可以在 create_model 方法中执行此操作。有几种不同的方法可以附加子行和列。与其将 QStandardItem 直接传递给 model.appendRow,不如创建它并将其保存在变量中。然后,您可以使用 QStandardItem.appendRow 将子级添加到您的***行。
我不懂 Python,可能会弄错语法,但基本模式是这样的:
std_item = QtGui.QStandardItem ("Dinner")
child_std_item = QtGui.QStandardItem ("Drinks")
std_item.appendRow (child_std_item)
或者,您可以使用 model.insertRow 在模型级别执行此操作并指定父项的 QModelIndex。您可以使用 model.indexFromItem 获取项目的 QModelIndex。希望这足以让你继续前进。每个 QStandardItem 都知道它的父项(如果有的话)和它的子项,因此通常需要让父项可用于添加/更改/删除子项。
【讨论】:
以上是关于如何添加 qtreeview 子项的主要内容,如果未能解决你的问题,请参考以下文章
如何在 QAbstractItemModel 和 QTreeView 类中找到子项?
QTableWidget 作为 QTreeView 中的子级