LINUX.ORG.RU

PyQt. Не работает сигнал в своем классе

 , , ,


0

1
class mp3Line(object):
    def __init__(self, parent, country, path):
        line = QtGui.QHBoxLayout()
        countryLabel = QtGui.QLabel(country)
        playButton = QtGui.QPushButton("Play")
 
        countryLabel.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)
        line.addWidget(countryLabel)
        line.addWidget(playButton)
        parent.addLayout(line)
 
        self.path = path
        playButton.clicked.connect(self.play)
 
    def play(self):
        print "play bleat"
        
class Ui_Form(object):
    def __init__(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(775, 49)
        self.horizontalLayout = QtGui.QHBoxLayout(Form)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.verticalLayout = QtGui.QVBoxLayout()
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.horizontalLayout_2 = QtGui.QHBoxLayout()
        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
        self.word = QtGui.QLineEdit(Form)
        self.word.setObjectName(_fromUtf8("word"))
        self.horizontalLayout_2.addWidget(self.word)
        self.searchButton = QtGui.QPushButton(Form)
        self.searchButton.setFocusPolicy(QtCore.Qt.WheelFocus)
        self.searchButton.setObjectName(_fromUtf8("searchButton"))
        self.horizontalLayout_2.addWidget(self.searchButton)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout.addLayout(self.verticalLayout)
 
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
        self.searchButton.clicked.connect(self.search)
        self.word.returnPressed.connect(self.search)
        self.Form = Form
 
    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
        self.searchButton.setText(QtGui.QApplication.translate("Form", "Search", None, QtGui.QApplication.UnicodeUTF8))
 
    def search(self):
        ....
        mp3Info = [("/tmp/ololo.mp3", "Russia"), ("/tmp/trololo.mp3", "USA")]
 
        for path, country in mp3Info:
            mp3 = mp3Line(self.verticalLayout, country, path)

В классе Ui_Form конструкция вида

self.searchButton.clicked.connect(self.search)
работает нормально, сигнал срабатывает, слот выполняется. Но вот в классе mp3Line при нажатии на созданные кнопки (playButton) слот не срабатывает. Ошибок нет.

Пробовал в класс mp3Line добавлять уже и вот такие кусочки кода:
QtCore.QMetaObject.connectSlotsByName(Form)
widget.setObjectName(_fromUtf8("widgetName"))
но ни чего не выходит.

Рассчитываю на Вашу помощь.

Только классы Qt могут работать с сигналами(порождать их и слушать). Поэтому твой класс должен наследоваться от QObject.

Беглое гугление даёт такую ссылку для PyQt: http://stackoverflow.com/questions/17461229/how-to-emit-signal-from-a-non-pyq...

Из первого ответа:

from PyQt4 import QtGui as QG
from PyQt4 import QtCore as QC

class SenderObject(QC.QObject):
    something_happened = QC.pyqtSignal()

Дальше сам уже почитаешь по ссылочке.

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

Спасибо за ответ, не смотря на то, что у меня все равно ни чего не получилось из того, что попробовал, но это уже, что-то.

Не могу понять как приведенная ссылка может мне помочь. Там ведь совсем другая задача, там человеку требуется при каком-то условии отправлять и обрабатывать сигнал. Мне же самому отправлять сигнал не нужно, я лишь хочу, чтобы в написанном мною классе в котором создается кнопка по сигналу 'clicked' выполнялся мой слот.

Я просто пока еще не особо силен в ООП, может по этому и не понял в каком направлении вы меня направили. Но уже полтора часа сижу пробую, что-то, но результат нулевой.

Coco_Jamboo
() автор топика
Ответ на: комментарий от Coco_Jamboo

Тебе нужно отнаследовать свой класс от QObject. Потом написать обработчик нужного сигнала и сделать connect между поставщиком сигнала (кнопкой) и твоим обработчиком.

Попробуй ещё прочитать это: http://pythonxy.googlecode.com/hg-history/4ef4255f59b092a123a5788c821434d9fe9...

Обрати внимание, что класс Foo объявляется как:

class Foo(QObject)
Norgat ★★★★★
()
Последнее исправление: Norgat (всего исправлений: 1)
Ответ на: комментарий от Coco_Jamboo

ТС ты точно хочешь продолжать писать на питоне на зная путем Qt4 ?

может стоит с крестов начать?

ЗЫ по Qt4 могу поконсультировать, черкни на мыло. оно в профиле есть.

MikeDM ★★★★★
()
Ответ на: комментарий от Norgat

Да от QObject я унаследовался еще после первого вашего сообщения. Но код только лишь от этого не заработал.

Я перепробовал много чего из приведенных примеров по ссылке и вдруг код заработал, я начал разбираться, что же я конкретно изменил после чего код заработал. Начал удалять лишние по моему мнению строчки и пришел к самому минималистичному виду при котором все работает:

class mp3Line(QtCore.QObject):
    def __init__(self, parent, country, path):
        class PushButton(QtGui.QPushButton):
            def __init__(self, p, parent = None):
                super(PushButton, self).__init__(parent)
                self.ppp = p

        line = QtGui.QHBoxLayout()
        countryLabel = QtGui.QLabel(country)
        playButton = PushButton(self)

        countryLabel.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)
        line.addWidget(countryLabel)
        line.addWidget(playButton)
        parent.addLayout(line)
 
        self.path = path
        playButton.clicked.connect(self.play)

    def play(self):
        print self.path
И вот, что я не могу понять. Если закомментировать в написанном мною классе PushButton сточку:
self.ppp = p
То все перестает работать и слот не выполняется. Как так то? Я вообще не понимаю почему данный код работает, ведь по сути мой класс PushButton ни чем не отличается от QPushButton.

Coco_Jamboo
() автор топика
Ответ на: комментарий от MikeDM

У меня сейчас задача стоит именно хорошо изучить Python, Qt лишь помощник для решения каких-то задач которые хотелось бы решить именно с GUI.

Пробовал использовать wxPython, но уже даже не вспомню с какими трудностями столкнулся которые меня оттолкнули от данной либы.

А с Qt я уже как раз был знаком, еще когда писал на крестах, собственно по этому и выбрал эту библиотеку.

Coco_Jamboo
() автор топика
Ответ на: комментарий от Coco_Jamboo

А с Qt я уже как раз был знаком, еще когда писал на крестах, собственно по этому и выбрал эту библиотеку.

Вот тогда меня смущает твое незнание сигнально-слотовой парадигмы.

MikeDM ★★★★★
()
Ответ на: комментарий от Coco_Jamboo

Если ты просто хочешь изучить питон, то для GUI лучше используй Tk, он намного проще. Tk есть среди стандартных модулей питона(гугли tkinter). Qt, конечно, намного круче, но там своя логика есть, и если ты ее не знаешь, то изучать другой язык по Qt у тебя получится не долго.

Aswed ★★★★★
()
Последнее исправление: Aswed (всего исправлений: 1)
Ответ на: комментарий от Coco_Jamboo

подозреваю GC, попробуй self.playButton вместо playButton

fluorite ★★★★★
()

Про PyQt ничего не знаю, но возможно стоит вызвать в своем __init__() конструктор базового класса (QObject).

gv
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.