Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 21, 2011 16:53:10

|R|U|D|E|N|
От:
Зарегистрирован: 2010-09-24
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

QTreeWidget. connect к конкретному Item'y

Добрый день.

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

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



Пытаюсь создать действие при клике мыши на Компонет1

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

С уважением, Александр.



Офлайн

#2 Дек. 22, 2011 06:06:52

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

QTreeWidget. connect к конкретному Item'y

Тут же все очевидно (с высоты моего нескромного опыта:))
Есть элемент дерево, у него сигнал 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 (которое отображает данные). Сложновато для понимания, но вещь красивая.



Офлайн

#3 Дек. 22, 2011 08:59:11

|R|U|D|E|N|
От:
Зарегистрирован: 2010-09-24
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

QTreeWidget. connect к конкретному Item'y

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



Офлайн

#4 Дек. 22, 2011 10:25:21

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

QTreeWidget. connect к конкретному Item'y

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 в чистом виде не получится.



Офлайн

#5 Дек. 22, 2011 16:27:27

|R|U|D|E|N|
От:
Зарегистрирован: 2010-09-24
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

QTreeWidget. connect к конкретному Item'y

Все, dartNNN понял! Всего одна строчка раставила наконец все по местам) Спасибо ,большое! вы мне очень помогли)



Офлайн

#6 Дек. 23, 2011 18:06:26

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

QTreeWidget. connect к конкретному Item'y

А здесь я что не так делаю? Кликаю по элементам списка, а функция 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_())



Офлайн

#7 Дек. 24, 2011 00:58:09

Ginibe
От:
Зарегистрирован: 2011-04-19
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

QTreeWidget. connect к конкретному Item'y

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 - мрого полезного и занимательного :)



Отредактировано (Дек. 24, 2011 01:07:36)

Офлайн

#8 Дек. 24, 2011 16:39:33

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

QTreeWidget. connect к конкретному Item'y

Спасибо огромное дружелюбному сообществу за ответы!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version