Форум сайта python.su
Добрый день.
Есть дерево элементов такого типа:
+ Групаа
+ Элемент
Компонент1
Компонент2
+Элемент2
…
Пытаюсь создать действие при клике мыши на Компонет1
QtCore.QObject.connect(tree, QtCore.SIGNAL('itemClicked(QTreeWidgetItem *, int)'), MY_FUN());
Офлайн
Тут же все очевидно (с высоты моего нескромного опыта:))
Есть элемент дерево, у него сигнал 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 (которое отображает данные). Сложновато для понимания, но вещь красивая.
Офлайн
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
Офлайн
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()))
Офлайн
Все, dartNNN понял! Всего одна строчка раставила наконец все по местам) Спасибо ,большое! вы мне очень помогли)
Офлайн
А здесь я что не так делаю? Кликаю по элементам списка, а функция 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_())
Офлайн
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_())
Отредактировано (Дек. 24, 2011 01:07:36)
Офлайн
Спасибо огромное дружелюбному сообществу за ответы!
Офлайн