gpt4 book ai didi

qml - 在关闭 QQuickView 或 QApplication 之前询问确认

转载 作者:行者123 更新时间:2023-12-04 19:08:59 25 4
gpt4 key购买 nike

我正在尝试在我的 MyApplication 中捕捉一个关闭事件继承自 QApplication 的实例或在我的WindowQML继承自 QQuickView 的实例.目标是在真正关闭应用程序之前要求确认退出。

在我的应用程序依赖 QMainWindow 之前我在哪里实现了closeEvent()像这样的方法:

// MainWindow inherits from QMainWindow
void MainWindow::closeEvent(QCloseEvent *event)
{
event->ignore();
confirmQuit(); // ask for confirmation first
}

问题是我的类(class) WindowQML继承自 QQuickView永远不要进入 closeEvent()方法。然后我尝试重载 event()像这样的方法:
// WindowQML inherits from QQuickView
bool WindowQML::event(QEvent *event)
{
if(event->type() == QEvent::Close)
{
qDebug() << "CLOSE EVENT IN QML WINDOW";
}
}

但这个事件也从未发生过。

我试图采取的下一条路是 catch MyApplication 中的 close 事件。像这样:
// We need to check for the quit event to ask confirmation in the QML view
bool MyApplication::event(QEvent *event)
{
bool handled = false;

switch (event->type())
{
case QEvent::Close:
qDebug() << "Close event received";
event->ignore(); // mandatory?
handled = true;
Q_EMIT quitSignalReceived();
break;

default:
qDebug() << "Default event received";
handled = QApplication::event(event);
break;
}

qDebug() << "Event handled set to : " << handled;
return handled;
}

信号 quitSignalReceived()被正确发出,但事件没有被正确“阻止”,我的应用程序仍然关闭。

所以我有两个问题:
  • 有没有办法检测 QQuickView 的关闭事件?实例?
  • 如果不可能,是 MyApplication::event()最好的做法是什么?为什么我需要调用event->ignore()这里?我原以为返回 true就足够了。
  • 最佳答案

    不知道为什么QWindow没有closeEvent便利事件处理程序。看起来是个错误,遗憾的是在 Qt 6.0 之前无法添加。无论如何,任何 QWindow 肯定会得到 QCloseEvent当它关闭时。所以只需覆盖event并在那里执行您的事件处理。

    证明:

  • QGuiApplication source code
  • 这个测试程序:
    #include <QtGui>

    class Window : public QWindow
    {
    protected:
    bool event(QEvent *e) Q_DECL_OVERRIDE
    {
    int type = e->type();
    qDebug() << "Got an event of type" << type;
    if (type == QEvent::Close)
    qDebug() << "... and it was a close event!";

    return QWindow::event(e);
    }
    };

    int main(int argc, char **argv)
    {
    QGuiApplication app(argc, argv);
    Window w;
    w.create();
    w.show();
    return app.exec();
    }

    打印这个
    Got an event of type 17 
    Got an event of type 14
    Got an event of type 13
    Got an event of type 105
    Got an event of type 13
    Got an event of type 206
    Got an event of type 206
    Got an event of type 8
    Got an event of type 207
    Got an event of type 19
    ... and it was a close event!
    Got an event of type 18
  • 关于qml - 在关闭 QQuickView 或 QApplication 之前询问确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17593008/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com