У меня проблемы с привязкой события «При закрытии» для моего приложения, написанного на QtQuick. То, что я хотел бы сделать, это сделать стандартный метод «подтверждения выхода» и, возможно, я поступаю неправильно.
Насколько я понимаю, я хочу что-то вроде
void MainDriver::onClose(QEvent* event)
{
if(notSaved)
{
//prompt save
event->ignore();
}
else
event->accept();
}
однако кажется, что QQuickCloseEvent не является производным от QEvent, или я включаю неправильный заголовок (очень возможно), и я не могу узнать, где он определен, чтобы я мог соединить сигналы.
Есть ли лучший способ обойти это? Прямо сейчас я создаю экземпляр главного окна следующим образом:
QQmlApplicationEngine engine; //Actually initialized in the constructor
engine.load(QUrl("qrc:/qml/Window.qml"));
QObject *topLevel = engine.rootObjects().value(0);
QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
Я использую ApplicationWindow (QtQuick Controls) в качестве основного окна, которое является производным от QWindow. Я открыт для предложений, я хотел бы придерживаться QtQuick и не оборачивать все в стандартный QWindow или QMainWindow, но, возможно, это плохой путь. Любая помощь будет оценена.
Ты можешь использовать EventFilter для обработки события закрытия в контроллере главного окна:
class MyEventFilter : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
bool MyEventFilter::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::Close)
{
// TODO: confirm
return true;
} else
{
// standard event processing
return QObject::eventFilter(obj, event);
}
}
И в вашей главной ():
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
MyEventFilter filter;
QtQuick2ApplicationViewer viewer;
viewer.installEventFilter(&filter);
viewer.setMainQmlFile(QStringLiteral("qml/QCloseConfirm/main.qml"));
viewer.showExpanded();
return app.exec();
}
Вот это пример. Но это не кажется идеальным. Там должно быть лучшее решение.
Других решений пока нет …