Уведомления

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

#1 Янв. 22, 2010 08:46:27

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

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

__del__ поможет только частично, так как в момент вызова сам виджет уже удален.



Офлайн

#2 Янв. 22, 2010 10:38:11

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

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

У __del__ свои тараканы. Объект, реализовавший этот метод, не собирается python garbage collector. Т.е. простой decref для него работает, а gc видит - но игнорирует. Иногда это дает довольно неожиданные эффекты. Конечно, все лечится - но внимания требует больше.



Офлайн

#3 Янв. 22, 2010 15:53:56

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

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

А если там вызвать self.__super__.__del__(self), то все равно?



Офлайн

#4 Янв. 23, 2010 14:12:19

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

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

Задачу решил вызовом своего сигнала на который подписал виджеты, которые должны знать о закрытии диалога.

self.connect(self, QtCore.SIGNAL("mycloseevent()"), self.mywidget.close_event)
и по closeEvent() делаю emit

self.emit(QtCore.SIGNAL("mycloseevent()"))



Офлайн

#5 Янв. 23, 2010 17:03:52

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Можно чуть проще(есть сигнал destroyed() ) :

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from PyQt4 import QtGui,QtCore
#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 close_event(self):
print "TestWidget closeEvent"

class TestDialog( QtGui.QDialog ):
def __init__( self, *args ):
QtGui.QWidget.__init__( self, *args )
gridLayout = QtGui.QGridLayout(self)
self.mywidget = TestWidget(self)
gridLayout.addWidget( self.mywidget, 0, 0, 1, 1)
self.connect(self, QtCore.SIGNAL("destroyed()"), self.mywidget.close_event)
def closeEvent(self, event):
print "TestDialog closeEvent"
event.accept()

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



Офлайн

#6 Янв. 23, 2010 18:19:18

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

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

gmorgunov: при подписывании на destroyed() возникает та же проблема что и при __del__, на момент вызова qt-шный объект уже уничтожен и его атрибуты не доступны.



Офлайн

#7 Янв. 24, 2010 17:06:54

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Экспериментально выяснил: QEvent.Close (closeEvent(event)) действительно не отправляется ребенку(TestWidget), но после закрытия окна(TestDialog), TestWidget-у отправляется 2 события: QEvent.WindowDeactivate и QEvent.Hide. Любое из них можно обработать.
Вот так работает без сигналов:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
class TestWidget(QWidget ):
def __init__( self, parent=None ):
QWidget.__init__( self, parent )
self.verticalLayout = QVBoxLayout(self)
self.label = QLabel("TestLabel", self)
self.verticalLayout.addWidget(self.label)
def event(self,event):
if event.type() == QEvent.Hide:
print "WIDGET", self.label.text()
return QWidget.event(self, event) # Отправляем дальше
class TestDialog(QDialog ):
def __init__( self, *args ):
QWidget.__init__( self, *args )
gridLayout = QGridLayout(self)
self.mywidget = TestWidget(self)
gridLayout.addWidget( self.mywidget, 0, 0, 1, 1)
self.count=0
def closeEvent(self, event):
print "DIALOG"
event.accept()
if __name__ == "__main__":
app = QApplication(sys.argv)
TestDialog().exec_()



Офлайн

#8 Янв. 24, 2010 19:58:15

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

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

Немного доработал пример, чтоб не ловить все события.

    def hideEvent(self, event):
logging.debug("widget's hideevent (%s)" % event)
event.accept()
Плохо, что hideEvent срабатывает при переключении закладки, если виджет размещен в QTabWidget.



Отредактировано (Янв. 24, 2010 20:16:57)

Офлайн

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

Board footer

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

Powered by DjangoBB

Lo-Fi Version