我在使用QtQuick编写的应用程序中绑定“On Close”事件时遇到问题。我想做的是做标准的“确认退出”方法,也许我会以错误的方式解决这个问题。
据我所知,我想要像
这样的东西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中,但也许这是一条糟糕的路线。任何帮助将不胜感激。
答案 0 :(得分:2)
您可以使用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();
}
Here就是一个例子。但它似乎并不完美。应该有一个更好的解决方案。