Найти - Пользователи
Полная версия: PyQt4: не ловится closeEvent в виджетах
Начало » GUI » PyQt4: не ловится closeEvent в виджетах
1 2
truporez
Не отрабатывает 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_()
pasaranax
Если я правильно понял описание closeEvent, то он срабатывает только при закрытии виджета являющегося окном, а твой TestWidget им не является.
truporez
Так точно. Вот еще-бы узнать как сие событие(закрытие, скрытие, уничтожение) таки поймать в виджете.
Андрей Светлов
Подпишите ваш widget явно на событие closeEvent для toplevel там, где этот виджет создаете.
truporez
Хм, добавление строки в конструктор диалога не дало результатов. Сигнатура 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 диалога, но хотелось бы разобраться.
Митрич
при закртытии диалог запускает несколько сигналов •void accepted ()•void finished (int)•void rejected ()
и вообще, переопределять все эти …Event() надо лишь в случае крайней необходимости. так djj,ot делать нельзя: QtCore.SIGNAL(“closeEvent(QCloseEvent *)”). у любого виджета есть слот close(), вот его и надо переопределять, не забыв в конце дописать super().close() или QWidget.close(self). только при закрытии диалога, это всё равно не приведет к вызову close() для вложенного виджета…
truporez
Ясно, спасибо.
pasaranax
Митрич
при закртытии диалог запускает несколько сигналов •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) - выполнять в самом начале.

п.с. а у классов в питоне нельзя переопределить деструктор?
Андрей Светлов
А “деструктор в питоне” - это что?
pasaranax
Ну, аналог деструктора в С++.. стоило погуглить перед вопросом..

Вот так сработает:
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")
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