1
我需要根據請求創建一個QTreeView。PyQT和QTreeView:當用戶點擊一個項目時需要詢問兒童
因此,當用戶打開應用程序時,它應該請求獲取樹的根項目。一旦用戶點擊該項目,它應該要求孩子,等等。
我找不到任何有關請求的工作示例,我根本不知道這是否可行。
我需要根據請求創建一個QTreeView。PyQT和QTreeView:當用戶點擊一個項目時需要詢問兒童
因此,當用戶打開應用程序時,它應該請求獲取樹的根項目。一旦用戶點擊該項目,它應該要求孩子,等等。
我找不到任何有關請求的工作示例,我根本不知道這是否可行。
真的很簡單。
首先,將樹的expanded信號連接到處理程序,並使用根的頂級項目填充樹。
當信號被觸發時,它會將擴展項的索引傳遞給處理函數。處理程序然後可以使用它來檢查項目是否有任何孩子使用,例如,模型的方法。
如果該項目已經有孩子,什麼也不做;否則,填充任何適合該項目的頂級項目。
UPDATE
下面是一個腳本演示瞭如何動態地構建樹。
爲簡單起見,該演示使用QTreeWidget,從而避免需要單獨的模型。其他數據通過使用QTreeWidgetItem.setData存儲在樹中。
請注意,導入頂端的sip
僅用於Python 2和Python 3之間的兼容性(有關詳細信息,請參見here)。如果您使用Python 2,則不需要。
import sip
sip.setapi('QVariant', 1)
from PyQt4 import QtGui, QtCore
class Window(QtGui.QTreeWidget):
def __init__(self):
QtGui.QTreeWidget.__init__(self)
self.setHeaderHidden(True)
self.itemExpanded.connect(self.handleExpanded)
self.itemClicked.connect(self.handleClicked)
self.handleExpanded(self.invisibleRootItem())
def depth(self, item):
depth = 0
while item is not None:
item = item.parent()
depth += 1
return depth
def requestData(self):
for title in 'One Two Three Four Five'.split():
yield title, 'additional data'
def addItems(self, parent):
depth = self.depth(parent)
for title, data in self.requestData():
item = QtGui.QTreeWidgetItem(parent, [title])
item.setData(0, QtCore.Qt.UserRole, data)
if depth < 3:
item.setChildIndicatorPolicy(
QtGui.QTreeWidgetItem.ShowIndicator)
def handleExpanded(self, item):
if item is not None and not item.childCount():
self.addItems(item)
def handleClicked(self, item, column):
print(item.data(column, QtCore.Qt.UserRole).toPyObject())
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
感謝您的回覆。我理解我必須將信號連接到處理程序的部分,但不能用hasChildren方法完成。當展開的方法被觸發時,我是否應該再次檢查該項目是否有孩子,然後將它們添加到模型中?還是應該以另一種方式創建模型? – estemendoza 2012-01-11 21:07:59
@estemendoza。什麼是用來填充樹的數據,它來自哪裏? – ekhumoro 2012-01-11 21:17:50
數據來自web服務,在給定項目(父)的情況下,它會以該項目的子項作爲響應。請耐心等待,因爲我是PyQT和QT本身的新手。希望這可以幫助。 – estemendoza 2012-01-13 01:05:20