Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 25, 2013 13:27:09

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

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

Причина в том, что Ui_Form2 присваивается локальной переменной ui, которая уничтожается после выхода из функции, а вместе с ней и обработчик нажатия. Достаточно сохранить ее, например, как атрибут, и все заработает:

def click(self):
    ...
    ui = Ui_Form2(self.Form2)
    self.form2_ui = ui
    ...

Но само создание класса без наследования QWidget неудобно, плюс нужно хранить и виджет и объект. Если код создается в дизайнере, посмотрите http://pyqt.sourceforge.net/Docs/PyQt4/designer.html#using-the-generated-code (2-й и 3-й примеры). Если вручную, то у young_programmer (только __call__ я бы не использовал)

Офлайн

#2 Авг. 25, 2013 13:48:39

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

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

reclosedev
только __call__ я бы не использовал
Без __call__ не работало бы.



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

Офлайн

#3 Авг. 25, 2013 14:28:44

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

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

young_programmer
Без __call__ не работало бы.
__call__ наверное один из способов и скорее пригодился бы при передаче парабетров в класс ,т.е именно здесь он избыточен
вот например так можно:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.button1 = QtGui.QPushButton(u"Пробуй", self)
        self.button1.setMinimumSize(QtCore.QSize(150, 70))
        self.button1.clicked.connect(self.on_click)
        
    def on_click(self):
    	self.button1.setText(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()"), self.click)
    def click(self):
        self.twoWindow = Window()
        self.twoWindow.show()
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

reclosedev спасибо. всё оказалось просто

Отредактировано vrabey (Авг. 25, 2013 14:32:13)

Офлайн

#4 Авг. 25, 2013 14:43:36

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

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

Спасибо, vrabey и reclosedev, учту на будующие)



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

Офлайн

#5 Авг. 25, 2013 18:28:51

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

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

reclosedev
Причина в том, что Ui_Form2 присваивается локальной переменной ui, которая уничтожается после выхода из функции, а вместе с ней и обработчик нажатия. Достаточно сохранить ее, например, как атрибут, и все заработает:
Хех, спасибо. Интересно то, что я с такой ошибкой уже несколько раз сталкивался, только в том случае окно появлялось и моментально закрывалось. А в этом случае как то и не заметил, что допустил ту же самую ошибку.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version