Ответ 1
Я бы попробовал QGuiApplication:: lastWindowClosed().
это может показаться очень простым вопросом, но я хочу сбросить некоторые данные всякий раз, когда закрывается QMainWindow
, поэтому я использовал следующий фрагмент кода:
QObject::connect(MainWindow.centralwidget, SIGNAL(destroyed()), this, SLOT(close()));
Но это, похоже, не вызывает вызов close()
. Я делаю это неправильно?
Разве это не означает, что centralwidget будет уничтожен?
Или, возможно, приложение закрывается до того, как close()
можно вызвать?.
Любые другие способы сделать это?
Я бы попробовал QGuiApplication:: lastWindowClosed().
Лучше повторить одну виртуальную функцию в своем основном классе MainWindow
следующим образом:
class MainWindow : public QMainWindow {
Q_OBJECT;
public:
MainWindow();
protected:
void closeEvent(QCloseEvent *event);
}
а затем объявите в исходном файле:
void MainWindow::closeEvent(QCloseEvent *event) {
// do some data saves or something else
}
Удачи.
Не удалось выполнить closeEvent
для вашего QMainWindow
и разместить там свой код?
Ваш начальный вопрос и код не совпадают. Если вы хотите что-то сделать на QMainWindow
, либо создайте подкласс и повторно выполните closeEvent
или подключитесь к MainWindow::destroyed()
, Однако см. Третий абзац для примечания.
Но ваш код показывает, что кажется третьим классом, который соединяет дочерний элемент MainWindow
, который будет уничтожен в какой-либо слот под названием close()
. centralwidget
будет уничтожен ПОСЛЕ того, как MainWindow уже уничтожен, поэтому это, скорее всего, не поможет вам.
Кроме того, это зависит от того, как вы создали MainWindow (стек или кучу), и если вы правильно его разрушаете. В идеале вы должны создать подкласс QMainWindow
(который, если вы уже использовали конструктор, у вас уже есть).
Внесите QMainWindow::closeEvent(QCloseEvent *)
в свой класс. Затем выполните новый сигнал с именем closing()
и испустите его из вашей реализации QMainWindow::closeEvent()
. Затем вы можете подключиться к этому сигналу, чтобы сделать что-то прямо перед закрытием окна. Вы также можете использовать closeEvent
, чтобы делать то, что вам нужно, например сохранять состояние, синхронизировать данные и т.д.
В Python (pyqt4 или pyqt5) вам нужно будет сделать следующее:
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
#
# My initializations...
#
''''''
def closeEvent(self, *args, **kwargs):
#
# Stuff I want to do when this
# just before (!) this window gets closed...
#
''''''
Интересно знать, что материал в функции closeEvent (..) запускается непосредственно перед окно закрывается. Вы можете проверить это со следующим тестом:
# Test if the closeEvent(..) function
# executes just before or just after the window closes.
def closeEvent(self, *args, **kwargs):
# 'self' is the QMainWindow-object.
print(self)
print(self.isVisible())
# Print out the same stuff 2 seconds from now.
QTimer.singleShot(2000, lambda: print(self))
QTimer.singleShot(2100, lambda: print(self.isVisible()))
''''''
Это вывод в вашем терминале:
<myProj.MyWindow object at 0x000001D3C3B3AAF8>
True
<myProj.MyWindow object at 0x000001D3C3B3AAF8>
False
Это доказывает, что окно все еще было видимым при входе в функцию closeEvent (..), но не после выхода из этой функции.
Как добавить код дампа в деструктор главного окна?