Найти - Пользователи
Полная версия: как правильно связать данные с узлом QTreeWidgetItem?
Начало » GUI » как правильно связать данные с узлом QTreeWidgetItem?
1
dimabest
Есть дерево QTreeWidget. Есть обработчики событий itemClicked и itemExpanded. Как правильно связать узел QTreeWidgetItem с набором данных, чтобы обработчик событий получил эти данные, по ним определил какой узел развернули/кликнули и что делать дальше?

Например, в C# для этой цели - каждый узел имеет свойство Tag.

В питоне можно так:
node = QtGui.QTreeWidgetItem(parent)
node.setText(column, 'my node')
# вот так?
node.my_property = my_data
Правильно ли так делать или нужно смотреть в сторону node.setData()?
ZZZ
Я бы рекомендовал забить на QTreeWidget и воспользоваться всей мощью QAbstractModel и QTreeView. Даже больше скажу – очень рекомендую.
gmorgunov
Я делаю следующим образом:
1) Переопределяю mousePressEvent(): в ней распознаю по координатам нажатия мыши на каком элементе щелкнули. Зная элемент, можно писать функции-обработчики.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyClass(QTreeWidget):

def __init__(self):
QTreeWidget.__init__(self)
self.setColumnCount(1)

item1=QTreeWidgetItem(self)
item1.setText(0,u'элемент1')
item1.setExpanded(True)

item2=QTreeWidgetItem(item1)
item2.setText(0,u'элемент2')

def mousePressEvent(self, event):
# определяем позицию нажатия мыши
x= event.pos().x(); y= event.pos().y()
# печатаем элемент, который щелкнули, здесь можно вызывать ф-ии обработчики
print unicode(self.itemAt(x,y).text(0))
# восстанавливаем поведение mousePressEvent()
QTreeWidget.mousePressEvent(self,event)

app = QApplication(sys.argv)
w = MyClass()
w.show()
app.exec_()
poltergeist
gmorgunov Глянь лучше на этот сигнал: QTreeWidget::itemClicked ( QTreeWidgetItem * item, int column ), dimabest его правильно использует.

dimabest В правильном направлении мыслишь, думаю лучше воспользоваться setData() в роли QtCore.Qt.UserRole. Похожий вопрос тут уже обсуждался (про drag&drop и mimeData), правда мнения тогда разошлись - решили делать по-питонски, хакать… я бы так не делал.

P.S. Мощь QAbstractItemModel не всегда нужна, с ней не легко разобраться и въехать, этому ещё и препятствует отсутствие нужных эксепшенов, которые указывали бы на ошибки в реализации модели. Сейчас же все эксепшены доносятся в едином облике прямо из недр С++ без указания места ошибки в питоновском коде. Или же приложение тупо падает. Может это уже и поправили, но такое было, приходилось изображать из себя дебаггер:( В общем если задача простая и данных относительно мало - лучше воспользоваться QTreeWidget, имхо. В других случаях MVC конечно же рулит и стоит напрячься для этого.
ZZZ
poltergeist
Сейчас же все эксепшены доносятся в едином облике прямо из недр С++ без указания места ошибки в питоновском коде. Или же приложение тупо падает.
О да… Сегфолты меня по-началу добивали… Но сейчас мне проще смастерить модель чем разбираться с поддержанием ТриИтемов в актуальном состоянии… Просто когда понимаешь как оно работает, проблемы отступают, а остаётся лишь удобство.

P.S. gmorgunov, это только в Фури-Кури гитара, это ударный инструмент, а в реальной жизни так делать не стоит…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB