Найти - Пользователи
Полная версия: PyQt не срабатывает сигнал.
Начало » GUI » PyQt не срабатывает сигнал.
1 2
Jah
Здравствуйте, прошу помощи разобраться с проблемой. Имеется такой тестовый код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtCore, QtGui

class Ui_Form2(object):
def __init__(self, Form):
self.button1 = QtGui.QPushButton("Does not work :(", Form)
self.button1.setMinimumSize(QtCore.QSize(150, 70))

self.button1.clicked.connect(self.click)

def click(self):
print "da"

class Ui_Form1(object):
def __init__(self, Form):
self.button1 = QtGui.QPushButton("Click me!", Form)
self.button1.setMinimumSize(QtCore.QSize(150, 70))

self.button1.clicked.connect(self.click)

def click(self):
self.Form2 = QtGui.QWidget()
ui = Ui_Form2(self.Form2)
self.Form2.show()

def main():
app = QtGui.QApplication(sys.argv)
win = QtGui.QWidget()
ui = Ui_Form1(win)

win.show()
app.exec_()

return 1

if __name__ == "__main__":
main()
Создается форма с одной кнопкой, по нажатию которой происходит открытие второй формы, тоже с кнопкой. Но вот слот click класса Ui_Form2 не срабатывает по нажатию кнопки второй формы.
Методом тыка был найден костыль который заставляет работать приведенный код, но это костыль который я не могу позволить себе использовать в своем проекте.
Вот рабочий код, добавлен костыльный класс PushButton.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtCore, QtGui

class Ui_Form2(object):
def __init__(self, Form):
class PushButton(QtGui.QPushButton):
def __init__(self, hz, name, parent = None):
super(PushButton, self).__init__(parent)
self.whatIsThis = hz

self.button1 = PushButton(self, "Does not work :(", Form)
self.button1.setMinimumSize(QtCore.QSize(150, 70))

self.button1.clicked.connect(self.click)

def click(self):
print "da"

class Ui_Form1(object):
def __init__(self, Form):
self.button1 = QtGui.QPushButton("Click me!", Form)
self.button1.setMinimumSize(QtCore.QSize(150, 70))

self.button1.clicked.connect(self.click)

def click(self):
self.Form2 = QtGui.QWidget()
ui = Ui_Form2(self.Form2)
self.Form2.show()

def main():
app = QtGui.QApplication(sys.argv)
win = QtGui.QWidget()
ui = Ui_Form1(win)

win.show()
app.exec_()

return 1

if __name__ == "__main__":
main()
Что самое интересное, так это если удалить строку self.whatIsThis = hz в классе PushButton, то слот опять перестает работать.

Прошу дать пояснение по данной проблеме, спасибо.
young_programmer
import sys
from PyQt4 import QtCore, QtGui
class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
    def __call__(self):
        self.button1 = QtGui.QPushButton(u"Пробуй", self)
        self.button1.setMinimumSize(QtCore.QSize(150, 70))
        self.button1.clicked.connect(self.on_click)
        self.show()
    def on_click(self):
    	print u'Все пучком'
class MainWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(200, 150)
        button = QtGui.QPushButton(u'Нажми меня', self)
        self.connect(button, QtCore.SIGNAL("clicked()"), Window())
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
Вот, проверяй, все работает.
vrabey
что б кто нибудь в двух словах объяснил почему код из вопроса не работает?
я так понимаю код в дизайнере генерится?
young_programmer
vrabey
что б кто нибудь в двух словах объяснил почему код из вопроса не работает?
Я не увидел явных ошибок в коде, все таки пока ещё новичок. Его код сильно глаз резал, по этому написал сам с тем же функционалом. Лучше же у человека будет рабочий код, чем совсем ни кто не откликнится.

Jah кстати ни кому, ни чего так и не ответил кстати, вообще не похоже, чтобы ему нужна была помощь
vrabey
young_programmer
Лучше же у человека будет рабочий код, чем совсем ни кто не откликнится
с этим я полность согласен , просто для саморазвития иногда лучше знать почему не работает чем почему работает.
если конечно это не разовая задача
Jah
young_programmer
Вот, проверяй, все работает.
Спасибо, но все же присоединяюсь к vrabey, чтобы кто-нибудь пояснил почему мой пример не работает.
vrabey
я так понимаю код в дизайнере генерится?
Нет, я сам писал.
young_programmer
Jah кстати ни кому, ни чего так и не ответил кстати, вообще не похоже, чтобы ему нужна была помощь
С чего вы это взяли? Если бы мне не нужна была помощь, я бы не обратился сюда. Я как то раз уже сталкивался с этой проблемой, но воспользовался костыльным методом. А столкнувшись второй раз понял, что нужно прояснить ситуацию, дабы дальше не идти этой кривой дорожкой. Да и в новом проекте слишком часто пришлось бы использовать мой костыль, а это сильно портит код, что аж самому не приятно.
young_programmer
vrabey
с этим я полность согласен , просто для саморазвития иногда лучше знать почему не работает чем почему работает.
Я с этим согласен, самому стало интересно почему не работает. На первый взгляд все логично. Дьявол как говорится кроется в мелочах.
vrabey
Jah
просто не встречал примеров где бы класс отображающий основное окно наследовался от object
обычно наследуется класс из модуля QtGui
просто где то рядо ответ почему не работает твой код
цитата отсюда:
http://forum.vingrad.ru/forum/topic-159421/kw-pyqt.html
"Все классы Qt являются наследниками класса QObject. Класс QObject в PyQt имеет метод connect, который и осуществляет соединение сигнал-слот или сигнал-сигнал. Также класс QObject имеет метод emit, генерирующий сигнал от объекта данного класса."
в общем как то это свясано
Jah
vrabey
Jahпросто не встречал примеров где бы класс отображающий основное окно наследовался от objectобычно наследуется класс из модуля QtGui просто где то рядо ответ почему не работает твой кодцитата отсюда:http://forum.vingrad.ru/forum/topic-159421/kw-pyqt.html“Все классы Qt являются наследниками класса QObject. Класс QObject в PyQt имеет метод connect, который и осуществляет соединение сигнал-слот или сигнал-сигнал. Также класс QObject имеет метод emit, генерирующий сигнал от объекта данного класса.”в общем как то это свясано
Да я уже догадался, что причина в наследовании, уже переписываю код как в примере товарища young_programmer. Вопрос лишь в том, почему класс Ui_Form1 работает, а Ui_Form2 нет, ведь они практически идентичные!

young_programmer
Jah
Вопрос лишь в том, почему класс Ui_Form1 работает, а Ui_Form2 нет, ведь они практически идентичные!
Вот меня тоже именно это и вводит в ступор.
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