Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt4: не ловится closeEvent в виджетах [RSS Feed]

#1 Янв. 20, 2010 20:10:59

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQt4: не ловится closeEvent в виджетах

Не отрабатывает closeEvent в экземпляре TestWidget. Можно конечно дергать этот метод из closeEvent диалога, но как-то это криво. Как TestWidget'у получить событие о закрытии диалога?

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from PyQt4 import QtGui
import logging
import sys

class TestWidget( QtGui.QWidget ):
def __init__( self, parent=None ):
QtGui.QWidget.__init__( self, parent )
self.verticalLayout = QtGui.QVBoxLayout(self)
self.label = QtGui.QLabel("TestLabel", self)
self.verticalLayout.addWidget(self.label)
def closeEvent(self, event):
logging.debug("TestWidget closeEvent")

class TestDialog( QtGui.QDialog ):
def __init__( self, *args ):
QtGui.QWidget.__init__( self, *args )
gridLayout = QtGui.QGridLayout(self)
widget = TestWidget(self)
gridLayout.addWidget( widget, 0, 0, 1, 1)
def closeEvent(self, event):
logging.debug("TestDialog closeEvent")
event.accept()

if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
TestDialog().exec_()



Офлайн

#2 Янв. 21, 2010 01:37:41

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4: не ловится closeEvent в виджетах

Если я правильно понял описание closeEvent, то он срабатывает только при закрытии виджета являющегося окном, а твой TestWidget им не является.



Офлайн

#3 Янв. 21, 2010 09:21:44

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQt4: не ловится closeEvent в виджетах

Так точно. Вот еще-бы узнать как сие событие(закрытие, скрытие, уничтожение) таки поймать в виджете.



Офлайн

#4 Янв. 21, 2010 09:45:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

PyQt4: не ловится closeEvent в виджетах

Подпишите ваш widget явно на событие closeEvent для toplevel там, где этот виджет создаете.



Офлайн

#5 Янв. 21, 2010 13:44:22

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQt4: не ловится closeEvent в виджетах

Хм, добавление строки в конструктор диалога не дало результатов. Сигнатура closeEvent неверная или диалог не toplevel? Сам-то он отлично ловит закрытие в метод closeEvent.

class TestDialog( QtGui.QDialog ):
def __init__( self, *args ):
QtGui.QWidget.__init__( self, *args )
gridLayout = QtGui.QGridLayout(self)
widget = TestWidget(self)
self.connect(self, QtCore.SIGNAL("closeEvent(QCloseEvent *)"), widget.closeEvent )
gridLayout.addWidget( widget, 0, 0, 1, 1)
Можно конечно законнектить виджеты на свой сигнал типа closeMyWidgets и эмитить его из closeEvent диалога, но хотелось бы разобраться.



Отредактировано (Янв. 21, 2010 13:45:25)

Офлайн

#6 Янв. 21, 2010 14:18:06

Митрич
От:
Зарегистрирован: 2009-03-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4: не ловится closeEvent в виджетах

при закртытии диалог запускает несколько сигналов •void accepted ()•void finished (int)•void rejected ()
и вообще, переопределять все эти …Event() надо лишь в случае крайней необходимости. так djj,ot делать нельзя: QtCore.SIGNAL(“closeEvent(QCloseEvent *)”). у любого виджета есть слот close(), вот его и надо переопределять, не забыв в конце дописать super().close() или QWidget.close(self). только при закрытии диалога, это всё равно не приведет к вызову close() для вложенного виджета…



Офлайн

#7 Янв. 21, 2010 14:31:01

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQt4: не ловится closeEvent в виджетах

Ясно, спасибо.



Офлайн

#8 Янв. 22, 2010 00:07:26

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4: не ловится closeEvent в виджетах

Митрич
при закртытии диалог запускает несколько сигналов •void accepted ()•void finished (int)•void rejected ()
и вообще, переопределять все эти …Event() надо лишь в случае крайней необходимости. так djj,ot делать нельзя: QtCore.SIGNAL(“closeEvent(QCloseEvent *)”). у любого виджета есть слот close(), вот его и надо переопределять, не забыв в конце дописать super().close() или QWidget.close(self). только при закрытии диалога, это всё равно не приведет к вызову close() для вложенного виджета…
Маны всякие по qt учат как раз переопределять *Event()-ы, а не методы, они же вроде для этого и нужны. А при переопределении функций, имхо, разумнее такие штуки - QWidget.method(self) - выполнять в самом начале.

п.с. а у классов в питоне нельзя переопределить деструктор?



Офлайн

#9 Янв. 22, 2010 00:56:17

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

PyQt4: не ловится closeEvent в виджетах

А “деструктор в питоне” - это что?



Офлайн

#10 Янв. 22, 2010 01:44:37

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4: не ловится closeEvent в виджетах

Ну, аналог деструктора в С++.. стоило погуглить перед вопросом..

Вот так сработает:

class TestWidget( QtGui.QWidget ):
def __init__( self, parent=None ):
QtGui.QWidget.__init__( self, parent )
self.verticalLayout = QtGui.QVBoxLayout(self)
self.label = QtGui.QLabel("TestLabel", self)
self.verticalLayout.addWidget(self.label)
def __del__(self):
logging.debug("TestWidget closeEvent")



Офлайн

  • Начало
  • » GUI
  • » PyQt4: не ловится closeEvent в виджетах[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version