QtQuick2 无法将应用程序窗口关闭信号连接到方法(C++新手)

QtQuick2 Can't connect ApplicationWindow closing signal to method (C++ novice)

本文关键字:方法 连接 C++ 新手 信号 应用程序 窗口 QtQuick2      更新时间:2023-10-16

我在为用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);

我正在使用应用程序窗口(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();
}

这是一个例子。但它似乎并不完美。应该有更好的解决方案。