Найти - Пользователи
Полная версия: QTreeWidget. connect к конкретному Item'y
Начало » GUI » QTreeWidget. connect к конкретному Item'y
1
|R|U|D|E|N|
Добрый день.

Есть дерево элементов такого типа:

+ Групаа
+ Элемент
Компонент1
Компонент2
+Элемент2



Пытаюсь создать действие при клике мыши на Компонет1
QtCore.QObject.connect(tree, QtCore.SIGNAL('itemClicked(QTreeWidgetItem *, int)'), MY_FUN());
Это единственный рабочий вариант кода но при этом MY_FUN() выполняется при клике мыши на любой из элементов дерева.
Как задать конкретный элемент не могу разобраться?

С уважением, Александр.
dartNNN
Тут же все очевидно (с высоты моего нескромного опыта:))
Есть элемент дерево, у него сигнал itemClicked с параметрами QTreeWidgetItem и int column (про column написано в документации. Беритесь за английский, без него в программировании никак, а с PyQt вообще никак). Не вижу никаких проблем, чтобы в функции проверять пришедший параметром QTreeWidgetItem на “нужность” и только после этого мучать его своим кодом:)
PS. MY_FUN - не питоновский стиль, функции должны назваться маленькими буквами.
PPS. QtCore.QObject.connect - старый стиль (api v1), нынче модно писать tree.itemClicked.connect(my_fun) (api v2) для перегрузки по умолчанию и tree.itemClicked.connect(my_fun) для конкретной перегрузки.
PPPS. В PyQt всякие там виджеты (TreeWidget, ListWidget, TableWidget) - это все старые классы, нынче модно юзать View/Model фреймворк, когда пишется модель (которая хоть из базы, хоть из воздуха берет данные) и она подключается к view (которое отображает данные). Сложновато для понимания, но вещь красивая.
|R|U|D|E|N|
dartNNN, спасибо за конструктивную критику и советы! Обезательно прийму к сведеньям) я в принципе только начинаю писать на python и qt.

Но я так и не понял что нужно уазывать вместо “QTreeWidgetItem *”

Если я выполняю ServicesTreeItem = tree.findItems(“Services”, QtCore.Qt.MatchRecursive, 0); и подставляю ServiceTreeItem в котором хранится объект нужного мне итема то я получаю ошибку:

QtCore.QObject.connect(treet, QtCore.SIGNAL('itemClicked(ServicesTreeItem, int)'), MY_FUN);
TypeError: C++ type 'ServicesTreeItem' is not supported as a slot argument type
dartNNN
QtCore.QObject.connect(tree, QtCore.SIGNAL('itemClicked(QTreeWidgetItem *, int)'), MY_FUN);
Обрати внимание, что ‘itemClicked(QTreeWidgetItem *, int)’ это строка - сигнатура метода. (увы без сложных слов тут не обойтись).
Что сие обозначает: сигналы могту быть “перегружены” (это когда есть несколько сигналов с одним именем, но разными параметрами). Поскольку python язык динамический, в нем нельзя по слоту (функция которая привязывается к сигналу) определить какой именно сигнал привязывается. Поэтому нужно писать такие вещи ‘itemClicked(QTreeWidgetItem *, int)’ (itemClicked для api v2) - имя сигнала + ТИП параметров.
Таким образом эту строку тебе менять ничуть не надо, а надо понимать, что в твой метод my_func передается параметр QTreeWidgetItem, на котором был клик, и int - номер столбца. Т.е. твой метод дожен выглядеть как-то так:
my_func(item, column):
if "Services" in item.text():
print("Я тыкнул на QTreeWidgetItem c текстом {0}".format(item.text()))
Т.е. в твой метод передается параметром item на который был клик, и в этом методе ты можешь с ним делать что хочешь. А прицепиться к клику только на конкретный item в чистом виде не получится.
|R|U|D|E|N|
Все, dartNNN понял! Всего одна строчка раставила наконец все по местам) Спасибо ,большое! вы мне очень помогли)
Hayate
А здесь я что не так делаю? Кликаю по элементам списка, а функция my_func не вызывается, не пишется ничего в вывод.
# -*- coding: utf-8 -*-
from PyQt4 import QtGui, QtCore
import sys

class MyWindow(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.Btn = QtGui.QPushButton('button')
self.ProfList = QtGui.QListWidget()
for i in range(1,10):
self.ProfList.addItem(str(i))
QtCore.QObject.connect(self.ProfList, QtCore.SIGNAL('itemClicked(QListWidgetItem * item)'), self.my_func);

self.Btn = QtGui.QPushButton('button')
self.vbox = QtGui.QVBoxLayout()
self.vbox.addWidget(self.Btn)
self.vbox.addWidget(self.ProfList)
self.setLayout(self.vbox)

def my_func(self):
print('my_func work')


app = QtGui.QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
Ginibe
Hayate,
Я немного подправил, теперь должно и у тебя сработать
Зачем два раза определять self.Btn ? Достаточно одно определение.
# -*- coding: utf-8 -*-
from PyQt4 import QtGui, QtCore
import sys

class MyWindow(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
# self.Btn = QtGui.QPushButton('button')
self.ProfList = QtGui.QListWidget()
for i in range(1,10):
self.ProfList.addItem(str(i))
# QtCore.QObject.connect(self.ProfList, QtCore.SIGNAL('itemClicked(QListWidgetItem * item)'), self.my_func);
self.ProfList.itemClicked.connect(self.my_func)

self.Btn = QtGui.QPushButton('button')
self.vbox = QtGui.QVBoxLayout()
self.vbox.addWidget(self.Btn)
self.vbox.addWidget(self.ProfList)
self.setLayout(self.vbox)

def my_func(self):
# print('my_func work')
#напоминание - исчисление индексов начинается с НУЛЯ, как в языке СИ
#в этом случае не совпадет с содержанием строки
print u'индекс списка - ', self.ProfList.currentRow()


app = QtGui.QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
Дружно читаем посты форума и букварь по PyQt - мрого полезного и занимательного :)
Hayate
Спасибо огромное дружелюбному сообществу за ответы!
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