2013-03-02 22 views
1

使用Python3和pyside。 我有一個Python字典,我想要顯示爲使用Qt的樹。我想要的值是可編輯的,但不是關鍵。我已成功地實現這一目標使用setItemWidget如下面的例子:在qtreewidget中使用自定義小部件的python/pyside

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

import sys 
from PySide import QtGui 

def data_to_tree(parent, data): 
    if isinstance(data, dict): 
     parent.setFirstColumnSpanned(True) 
     for key,value in data.items(): 
      child = QtGui.QTreeWidgetItem(parent) 
      child.setText(0, key) 
      data_to_tree(child, value) 
    elif isinstance(data, list): 
     parent.setFirstColumnSpanned(True) 
     for index,value in enumerate(data): 
      child = QtGui.QTreeWidgetItem(parent) 
      child.setText(0, str(index)) 
      data_to_tree(child, value) 
    else: 
     widget = QtGui.QLineEdit(parent.treeWidget()) 
     widget.setText(str(data)) 
     parent.treeWidget().setItemWidget(parent, 1, widget) 

app = QtGui.QApplication(sys.argv) 

wid = QtGui.QTreeWidget() 
wid.setColumnCount(2) 
wid.show() 

data = { 
    'foo':'bar', 
    'bar': ['f', 'o', 'o'], 
    'foobar':0, 
} 
data_to_tree(wid.invisibleRootItem(), data) 

sys.exit(app.exec_()) 

這工作,但它違背了文檔建議(靜態內容)是什麼,並使其無法事先創建的窗口小部件(在一個單獨的線程爲例),然後將其添加到樹中。有沒有更好的方法來實現我想要的?文檔提到QTreeView,但我還沒有找到任何示例/教程讓我明白它將如何幫助我在列中使用自己的小部件。

回答

2

有你可能要考慮兩個選項:

  • 您可以創建自己的類,這是一個QTreeWidget的子類。這很簡單,因爲你只是簡單地使用你現有的方法並把它放在課堂上。但是這並沒有真正改變很多,除了在你的自定義小部件上調用它時看起來更「自然」。

  • 另一種方法,這就是您談論文檔時最可能引用的模型/視圖體系結構。

在這種情況下,你將不得不使用QTreeView並創建自己的QTreeModel。在這裏,視圖完全不知道數據是什麼,模型負責提供所有數據,並在視圖準備好顯示時通知視圖。因此,當數據準備好/更改時,必須創建該對象併發出信號,以便更新視圖。

想了解如何實現類似的東西,你可以看一下PySide提供的例子。很可能你已經安裝了它們,請查看site-packages/PySide/examples/itemviews/simpletreemodel

此外,請考慮查看indexWidget方法,以便您可以在需要時添加您的QEditLine,並將默認值調用父級。