Найти - Пользователи
Полная версия: [PyQt] selectedIndexes - получение итема
Начало » GUI » [PyQt] selectedIndexes - получение итема
1
billy_bob
Здравствуйте.

Есть проблема в получении доступа к данным QTreeView выбранных элементов.
На форуме все пишут “используй selectedIndexes”, но я всё понять не могу как по элементам QModelIndexList получить сам итем TreeView

Подскажите, пожалуйста.
villager
можно как-то так попробовать
QTreeView.selectedIndexes[0].model().data(selectedIndexes[0],Qt.DisplayRole)
billy_bob
villager
можно как-то так попробовать
QTreeView.selectedIndexes[0].model().data(selectedIndexes[0],Qt.DisplayRole)
ммм.. извините, конечно, но что то я никак не пойму как с этим зверем собладать. данный код возвращает 4 объекта типа QVariant, каждый содержит по значению поля в строке (строка из 4-х полей). Причем
itm = self.ui.treExportProbes.model().data(index,Qt.DisplayRole).toStringList()
работает, но перебрать в цикле я его не могу
ptint itm.count()
выдаёт
>>> 
1
1
1
1
itm.takeAt(2) так же выдаёт выход за границы массива. Как будто itm = self.ui.treExportProbes.model().data(index,Qt.DisplayRole).toStringList() возвернул не один QStringList с четырьмя значениями, а 4 по 1.
помогите, пожалуйста, разобраться
billy_bob
Извиняюсь, .takeAt - это совсем не то, а .at почему то в PyQt нет :-(

Может всё-таки можно как то получить сам итем без извращений? тогда всё просто - item.text(index).
villager
billy_bob
Извиняюсь, .takeAt - это совсем не то, а .at почему то в PyQt нет :-(

Может всё-таки можно как то получить сам итем без извращений? тогда всё просто - item.text(index).
вот модифицировал подходящий пример
по клавише F5 печатает тексты выбранных элементов


import os
import sys
from PyQt4.QtSql import *
from PyQt4.QtGui import *

db=None

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class zzNode(object):
def __init__(self, parent, uid, txt):
super(zzNode, self).__init__()
self.parent=parent
self.uid=uid
self.txt=txt
self.child=[]
cursor=db.exec_("select * from treetest where parent_uid='%s'" % self.uid)
while cursor.next():
childId=cursor.record().field("uid").value().toString()
self.child.append(zzNode(self, childId, cursor.record().field("text").value().toString()))
def childCount(self):
return len(self.child)

class TreeOfTableModel(QAbstractItemModel):
def __init__(self, parent=None):
super(TreeOfTableModel, self).__init__(parent)
self.columns = 2
self.headers = ["key", "value"]
self.rootItem=zzNode(None, 0, "root")
def rowCount(self, parent):
if parent.column() > 0: return 0
if not parent.isValid():
parentItem = self.rootItem
else:
parentItem = parent.internalPointer()
return parentItem.childCount()

def columnCount(self, parent):
return self.columns

def data(self, index, role):
if role == Qt.DisplayRole:
tmp=index.internalPointer().child
if index.column()==0:
return QVariant(index.internalPointer().uid)
else:
return QVariant(index.internalPointer().txt)
else:
return QVariant()

def headerData(self, section, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return QVariant(self.headers[section])
return QVariant()

def index(self, row, column, parent):
if not self.hasIndex(row, column, parent):
return QModelIndex()
if not parent.isValid():
parentItem = self.rootItem
else:
parentItem = parent.internalPointer()
childItem = parentItem.child[row]
if childItem:
return self.createIndex(row, column, childItem)
else:
return QtCore.QModelIndex()

def parent(self, child):
node = child.internalPointer()
if node is None:
return QModelIndex()
parent = node.parent
if parent is None:
return QModelIndex()
grandparent = parent.parent
if grandparent is None:
return QModelIndex()
row = grandparent.child.index(parent)
return self.createIndex(row, 0, parent)


class TreeOfTableWidget(QTreeView):
def __init__(self):
super(TreeOfTableWidget, self).__init__()
self.setSelectionBehavior(QTreeView.SelectItems)
self.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.setUniformRowHeights(True)
model = TreeOfTableModel(self)
self.setModel(model)

class MainForm(QMainWindow):
def __init__(self):
super(MainForm, self).__init__()
self.treeWidget = TreeOfTableWidget()
self.setCentralWidget(self.treeWidget)
QShortcut(QKeySequence("Escape"), self, self.close)
self.setWindowTitle("TreeViewExample")
shortCut=QShortcut(QKeySequence("F5"),self)
def keyF5():
for x in self.treeWidget.selectedIndexes():
print x.model().data(x,Qt.DisplayRole).toString()
shortCut.activated.connect(keyF5)

app = QApplication(sys.argv)

db=QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName(":memory:")
db.open()
db.exec_("create table treetest (uid char primary key, parent_uid char , text char)")
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % ('ed1', 0, "01.10.2009"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (2, 0, "z02"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (3, 0, "z03"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (4, 'ed1', "z00-4"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (5, 'ed1', "z00-5"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (6, 2, "z00-6"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (7, 2, "z01-7"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (8, 7, "z01-8"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (9, 7, "z02-9"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (10, 3, "z03-10"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (11, 10, "z03-11"))
db.exec_("insert into treetest (uid,parent_uid,text) values ('%s','%s','%s')" % (12, 11, "z03-12"))
db.commit()

form = MainForm()
form.resize(750, 550)
form.show()
app.exec_()
billy_bob
В очередной раз гляжу на код, и вижу, что подход не верный. Вот глядите, в результате 10 минутной битвы получилось следующее:
    itm = []
x = 0
for index in self.ui.treExportProbes.selectedIndexes():
for i in self.ui.treExportProbes.model().data(index,Qt.DisplayRole).toStringList():
itm.append(i)
x = x + 1
if x == 4:
self.patLst.changeProbeStatus( itm[0], itm[2], itm[3] )
itm = []
x = 0
Объясню почему так. Выделяю я всю строчку, которая содержит 4 поля. Первый цикл, как выяснилось, проходит не просто по выделенным строкам, он проходит по суммарному значению всех выделенных полей. Поэтому пришлось внутри главного цикла разбивать по 4 элемента. Поэтому я подумал: “хрен с ним, пусть читабельность не очень, но по крайней мере работает. Пока хватит, дальше что нибудь придумаю”. Ан-нет. Для одной строки всё нормально работает. А вот когда выделяешь больше 1 - сюрприз. Он, оказывается, начинает обходить выделенные ячейки не по горизонтали, а по вертикали. Можно конечно поизвращаться, но что то мне подсказывает, что я придумываю костыли на пустом месте, и всё давно сделано до меня, тем более в такой мощной библиотеке. Вот только рабочего кода найти не могу :-(
villager
вот здесь
self.ui.treExportProbes.model().data(index,Qt.DisplayRole).toStringList()
зачем .toStringList() ?
model().data(index,Qt.DisplayRole) возвращает текст конкретного итема (как QVariant)
billy_bob
villager
вот здесь
self.ui.treExportProbes.model().data(index,Qt.DisplayRole).toStringList()
зачем .toStringList() ?
model().data(index,Qt.DisplayRole) возвращает текст конкретного итема (как QVariant)
да, здесь цикл лишний, по запарке написал. Но проблема от этого не уходит.
billy_bob
Да, выявил странную тенденцию. Обход выделенного происходит не просто по вертикали, а в зависимости от количества выбранных элементов.
Для одной выделенной строки - всё Ок. Для 2-х он берёт 2 с 3 столбца, и 2 с 4, для 3-ч он берет 1 с 3 и 3 с 4, для 4 он берет все 4 с 4.
Бред и костыли %)

В общем конечный вариант хреново работающего кода
    itm = []
x = 0
for index in self.ui.treExportProbes.selectedIndexes():
i = self.ui.treExportProbes.model().data(index,QtCore.Qt.DisplayRole)
itm.append(i)
x = x + 1
if x == 4:
self.patLst.changeProbeStatus( itm[0].toString(), str(itm[2].toString()), itm[3].toString() )
itm = []
x = 0
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