qt — QtQuick2 Не удается подключить закрывающий сигнал ApplicationWindow к методу (новичок в C ++)

У меня проблемы с привязкой события «При закрытии» для моего приложения, написанного на 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, но, возможно, это плохой путь. Любая помощь будет оценена.

1

Решение

Ты можешь использовать 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();
}

Вот это пример. Но это не кажется идеальным. Там должно быть лучшее решение.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]