Qt Python: QTreeWidget Дочерняя проблема - PullRequest
1 голос
/ 17 ноября 2009

У меня есть QTreewidget, который отлично работает, если у меня есть только один уровень в моем списке. Если я решу добавить дочерние подуровни, это выдаст мне ошибку. Вот код, который хорошо работает только без строк «childs» (см. После «child 1» и «child 2»).

def eqpt_centralwdg(self,MainWindow):
    self.centralwidget = QtGui.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")

    self.colorTreeWidget = QtGui.QTreeWidget(self.centralwidget)
    self.colorTreeWidget.setGeometry(QtCore.QRect(60, 60, 191, 141))
    self.colorTreeWidget.setObjectName("colorTreeWidget")

    # father root 1
    item = QtGui.QTreeWidgetItem(self.colorTreeWidget)
    #child 1 - from father 1
    item = QtGui.QTreeWidgetItem(item)
    #child 2 - from father 1
    item = QtGui.QTreeWidgetItem(item)
    # father root 2
    item = QtGui.QTreeWidgetItem(self.colorTreeWidget)         

    self.connect(self.colorTreeWidget, QtCore.SIGNAL('itemClicked(QTreeWidgetItem*, int)'), self.eqpt_activateInput)

    MainWindow.setCentralWidget(self.centralwidget)

def eqpt_retranslateUi(self, MainWindow):
    MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)
    self.colorTreeWidget.headerItem().setText(0, QtGui.QApplication.translate("MainWindow", "color", None, QtGui.QApplication.UnicodeUTF8) 
    __sortingEnabled = self.colorTreeWidget.isSortingEnabled()    
    self.colorTreeWidget.setSortingEnabled(False) 
    # father root 1
    self.colorTreeWidget.topLevelItem(0).setText(0, QtGui.QApplication.translate("MainWindow", "Yellow", None, QtGui.QApplication.UnicodeUTF8) 
    #child 1 - from father 1
    self.colorTreeWidget.topLevelItem(0).child(0).setText(0, QtGui.QApplication.translate("MainWindow", "Yellow Sun", None, QtGui.QApplication.UnicodeUTF8))
    #child 2 - from father 1
    self.colorTreeWidget.topLevelItem(0).child(1).setText(0, QtGui.QApplication.translate("MainWindow", "Yellow Gold", None, QtGui.QApplication.UnicodeUTF8))        

    # father root 2
    self.colorTreeWidget.topLevelItem(1).setText(0, QtGui.QApplication.translate("MainWindow", "Blue", None, QtGui.QApplication.UnicodeUTF8) 

    self.colorTreeWidget.setSortingEnabled(__sortingEnabled)

Вот вывод, когда он работает

def eqpt_activateInput(self,item,col):
    print "Qtree ok! pressed"
    print item.text(col)

если я исключаю строки, связанные с «child 1» и «child 2» из кода, он запускается. В противном случае выдает ошибку:

    AttributeError: 'NoneType' object has no attribute 'setText'

Я использовал Qt Designer для генерации кода и добавил несколько строк для запуска событий.

Любые намеки или предложения приветствуются.

Ответы [ 2 ]

5 голосов
/ 17 ноября 2009

Ваши узлы дерева выглядят так:

Node 1
   Node 1.1
      Node 1.1.1
Node 2

(простите за плохую презентацию)

В вашем коде вы получаете доступ ко второму дочернему элементу первого узла верхнего уровня:

#child 2 - from father 1
self.colorTreeWidget.topLevelItem(0).child(1)...

но его не существует, поскольку вы ошибочно (я полагаю) добавили дочерний элемент для неправильного узла.

В общем, я бы не стал строить ваше дерево таким образом, вы можете видеть, насколько запутанным оно становится, а вот так:

parent = QtGui.QTreeWidgetItem(self.colorTreeWidget)
firstchild = QtGui.QTreeWidgetItem(parent)
secondchild = QtGui.QTreeWidgetItem(parent)
parent = QtGui.QTreeWidgetItem(self.colorTreeWidget)

с уникальными именами для каждого узла гораздо понятнее.

Или даже это:

parent = QtGui.QTreeWidgetItem(self.colorTreeWidget)
parent.addChild(...)
parent.addChild(...)
0 голосов
/ 18 ноября 2009

Решено! Вот решение:

    parent1 = QtGui.QTreeWidgetItem(self.colorTreeWidget)
    child1_1 = QtGui.QTreeWidgetItem()
    child1_2 = QtGui.QTreeWidgetItem()
    parent1.addChild(child1_1)
    parent1.addChild(child1_2)

Теперь все работает правильно.

Еще раз спасибо за предложения и комментарии!

...