Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 23, 2013 17:55:43

Jah
Зарегистрирован: 2013-08-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt не срабатывает сигнал.

Здравствуйте, прошу помощи разобраться с проблемой. Имеется такой тестовый код:

#!/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, то слот опять перестает работать.

Прошу дать пояснение по данной проблеме, спасибо.

Офлайн

#2 Авг. 23, 2013 18:40:39

young_programmer
Зарегистрирован: 2013-08-22
Сообщения: 32
Репутация: +  -2  -
Профиль   Отправить e-mail  

PyQt не срабатывает сигнал.

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_())
Вот, проверяй, все работает.



Linux - это такая фэнтезийная MMORPG: эльфы в файлах, гномы на столах,
зомби в процессах, демоны в фоне, а на форумах сплошь тролли да красноглазые орки.

Отредактировано young_programmer (Авг. 23, 2013 18:52:19)

Офлайн

#3 Авг. 23, 2013 18:58:27

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

PyQt не срабатывает сигнал.

что б кто нибудь в двух словах объяснил почему код из вопроса не работает?
я так понимаю код в дизайнере генерится?

Офлайн

#4 Авг. 23, 2013 20:28:17

young_programmer
Зарегистрирован: 2013-08-22
Сообщения: 32
Репутация: +  -2  -
Профиль   Отправить e-mail  

PyQt не срабатывает сигнал.

vrabey
что б кто нибудь в двух словах объяснил почему код из вопроса не работает?
Я не увидел явных ошибок в коде, все таки пока ещё новичок. Его код сильно глаз резал, по этому написал сам с тем же функционалом. Лучше же у человека будет рабочий код, чем совсем ни кто не откликнится.

Jah кстати ни кому, ни чего так и не ответил кстати, вообще не похоже, чтобы ему нужна была помощь



Linux - это такая фэнтезийная MMORPG: эльфы в файлах, гномы на столах,
зомби в процессах, демоны в фоне, а на форумах сплошь тролли да красноглазые орки.

Отредактировано young_programmer (Авг. 23, 2013 20:41:03)

Офлайн

#5 Авг. 23, 2013 20:50:31

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

PyQt не срабатывает сигнал.

young_programmer
Лучше же у человека будет рабочий код, чем совсем ни кто не откликнится
с этим я полность согласен , просто для саморазвития иногда лучше знать почему не работает чем почему работает.
если конечно это не разовая задача

Офлайн

#6 Авг. 23, 2013 21:04:15

Jah
Зарегистрирован: 2013-08-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt не срабатывает сигнал.

young_programmer
Вот, проверяй, все работает.
Спасибо, но все же присоединяюсь к vrabey, чтобы кто-нибудь пояснил почему мой пример не работает.
vrabey
я так понимаю код в дизайнере генерится?
Нет, я сам писал.
young_programmer
Jah кстати ни кому, ни чего так и не ответил кстати, вообще не похоже, чтобы ему нужна была помощь
С чего вы это взяли? Если бы мне не нужна была помощь, я бы не обратился сюда. Я как то раз уже сталкивался с этой проблемой, но воспользовался костыльным методом. А столкнувшись второй раз понял, что нужно прояснить ситуацию, дабы дальше не идти этой кривой дорожкой. Да и в новом проекте слишком часто пришлось бы использовать мой костыль, а это сильно портит код, что аж самому не приятно.

Офлайн

#7 Авг. 23, 2013 21:08:50

young_programmer
Зарегистрирован: 2013-08-22
Сообщения: 32
Репутация: +  -2  -
Профиль   Отправить e-mail  

PyQt не срабатывает сигнал.

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



Linux - это такая фэнтезийная MMORPG: эльфы в файлах, гномы на столах,
зомби в процессах, демоны в фоне, а на форумах сплошь тролли да красноглазые орки.

Офлайн

#8 Авг. 23, 2013 21:17:40

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

PyQt не срабатывает сигнал.

Jah
просто не встречал примеров где бы класс отображающий основное окно наследовался от object
обычно наследуется класс из модуля QtGui
просто где то рядо ответ почему не работает твой код
цитата отсюда:
http://forum.vingrad.ru/forum/topic-159421/kw-pyqt.html
"Все классы Qt являются наследниками класса QObject. Класс QObject в PyQt имеет метод connect, который и осуществляет соединение сигнал-слот или сигнал-сигнал. Также класс QObject имеет метод emit, генерирующий сигнал от объекта данного класса."
в общем как то это свясано

Офлайн

#9 Авг. 23, 2013 21:29:25

Jah
Зарегистрирован: 2013-08-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt не срабатывает сигнал.

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 нет, ведь они практически идентичные!

Офлайн

#10 Авг. 23, 2013 21:31:13

young_programmer
Зарегистрирован: 2013-08-22
Сообщения: 32
Репутация: +  -2  -
Профиль   Отправить e-mail  

PyQt не срабатывает сигнал.

Jah
Вопрос лишь в том, почему класс Ui_Form1 работает, а Ui_Form2 нет, ведь они практически идентичные!
Вот меня тоже именно это и вводит в ступор.



Linux - это такая фэнтезийная MMORPG: эльфы в файлах, гномы на столах,
зомби в процессах, демоны в фоне, а на форумах сплошь тролли да красноглазые орки.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version