Мой опыт работы в Qt составляет около двух недель, извините, если я случайно задаюсь глупым вопросом.QtQuick: как переопределить событие закрытия окна?
В моей программе используется графический интерфейс на основе QtQuick. Я отформатируйте ее в моем main.cpp
#include <QGuiApplication>
#include <QtQuick/QQuickView>
#include "VeryVeryImportantItem.h"
extern
int main(int argc, char * argv[])
{
qmlRegisterType<VeryVeryImportantItem>("com.my.stuff", 1, 0, "VeryVeryImportantItem");
QQuickView quickView(QUrl("MyView.qml"));
quickView.show();
QGuiApplication app;
return app.exec();
}
И MyView.qml выглядит следующим образом:
import QtQuick 2.1
import QtQuick.Window 2.1
import com.my.stuff 1.0
Item VeryVeryImportantItem {
id : veryVeryImportantItem
...
}
И VeryVeryImportantItem.h выглядит следующим образом:
#include <QtQuick/QQuickItem>
class VeryVeryImportantItem : public QQuickItem
{
Q_OBJECT
public:
Q_INVOKABLE void cleanup();
...
};
А теперь проблема. Как перехватить событие закрытия в моем корневом окне/представлении, вызвать VeryVeryImportantItem :: cleanup(); и только после этого закрыть приложение?
То, что я узнал теперь, что QQuickItem::window()
может дать мне указатель на окно, мне нужно, и что окно имеет сигнал QQuickWindow::closing(QQuickCloseEvent *);
и что в теории я могу предотвратить окна от закрытия манипулируя данный объект QQuickCloseEvent
, Но это не публика, у меня нет доступа к ее методам!
Ok. Другой способ может заключаться в том, что я мог бы сделать что-то подобное из QML. QML тип QWindow
имеет closing(CloseEvent)
сигнал, и если я установил CloseEvent.accepted
false в слот, подключенный к нему, который предотвратит немедленное закрытие окна и позволит мне вызвать метод veryVeryImportantItem.cleanup()
. Но тогда у меня есть другая проблема: как мне получить ссылку на мое корневое окно, если я создал его не в QML, а в стартовом коде C++.
Я думаю, что это очень распространенная ситуация, и, очевидно, должен быть четко определенный способ справиться с этим, но я уже четыре часа работаю в поисковых системах и до сих пор не нашел достойного объяснения.
VeryVeryImportantItem деструктор вызывается при закрытии окна. Вы можете сделать любую очистку здесь. – Meefte
Ну, я это знаю. Но это не подходит моему делу. Моя архитектура требует некоторого обмена сигналами, чтобы выполнить очистку. – krokoziabla