我在Qt的经历大概是两周,对不起,如果我碰巧问了一个愚蠢的问题。
我的程序使用基于QtQuick的GUI。我在 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();
...
};
现在问题。 如何在我的根窗口/视图上拦截close事件,调用VeryVeryImportantItem :: cleanup();并且只有在那之后关闭申请?
我现在发现的是QQuickItem::window()
可以给我指向我需要的窗口的指针,窗口有信号QQuickWindow::closing(QQuickCloseEvent *);
,理论上我可以阻止窗口关闭通过操纵给定的QQuickCloseEvent
对象。 但它不公开,我无法访问其方法!
确定。另一种方式可能是我可以用QML做类似的事情。 QML类型QWindow
有closing(CloseEvent)
信号,如果我在连接到它的插槽中设置CloseEvent.accepted
false,则会阻止窗口立即关闭并使我能够调用veryVeryImportantItem.cleanup()
方法。但是我还有另外一个问题:如果我在QML中创建它而不是在C ++启动代码中,我如何获得对我的根窗口的引用。
我想这是非常常见的情况,显然应该有一个定义明确的方法来解决这个问题,但我已经谷歌搜索了大约四个小时,但仍然没有找到任何合理的解释。
答案 0 :(得分:5)
我想这是非常常见的情况,显然应该这样做 是一个明确定义的方法来处理这个
是的,有人可以这么说。
最简单的方法是切换到使用QQmlApplicationEngine
并在QML端ApplicationWindow
作为根组件。
然后您可以简单地使用onClosing
信号处理程序来运行清理。我有一个类似的场景,如果在调用清理之前关闭应用程序会崩溃,这种方法可以完美运行。
//main.cpp
QQmlApplicationEngine engine;
engine.load(QUrl("MyView.qml"));
ApplicationWindow {
visible: true
width: 1280
height: 720
BoxView {
id: view
}
onClosing: {
view.deleteView()
}
}