Qt 应用程序状态生命周期

SR_*_*SR_ 5 c++ qt

我从 Qt 开始,但我不清楚应用程序状态。我使用 Qt 5.5。我目前正在 Windows 上学习,但下一步是 Android 设备,因此我关注应用程序状态。

我创建了自己的QApplication派生类,我已经注册了applicationStateChanged信号。我猜想我应该在applicationStateChanged收到信号时保留部分配置。我想我必须使用Qt.labs.settings,就像我想使用 QML 一样。

显然,我在很多事情上都错了。首先,我没有收到任何Qt::ApplicationSuspended消息。
我已经重写了以QApplication::event(e)查看是否错过了信号,并且似乎只Quit发送了事件。

QML debugging is enabled. Only use this in a safe environment.
void LAACApplication::event(QEvent *e = QEvent(LanguageChange, 0x28fd00) )
void LAACApplication::event(QEvent *e = QEvent(DynamicPropertyChange, 0x28fcbc) )
void LAACApplication::event(QEvent *e = QEvent(LanguageChange, 0x28fa70) )
void LAACApplication::event(QEvent *e = QEvent(ApplicationActivate, 0x28daf4) )
void LAACApplication::event(QEvent *e = QApplicationStateChangeEvent(ApplicationActive) )
void LAACApplication::onApplicationStateChanged(Qt::ApplicationState state = Qt::ApplicationState(ApplicationActive) )
void LAACApplication::event(QEvent *e = QEvent(Quit, 0x1fd88cc8) )
void LAACApplication::event(QEvent *e = QEvent(LanguageChange, 0x28fca0) )
Run Code Online (Sandbox Code Playgroud)

或者也许我应该按照此处QApplication::commitData()所述进行研究才能执行此类任务?

那么,简而言之:我应该如何使用 Qt 处理应用程序状态更改?

这是我的代码:

laacapplication.h

#ifndef LAACAPPLICATION_H
#define LAACAPPLICATION_H

#include <QApplication>

class LAACApplication : public QApplication
{
    Q_OBJECT
public:
    explicit LAACApplication(int &argc, char **argv);


public slots:
    void onApplicationStateChanged(Qt::ApplicationState state);

protected:
    bool event(QEvent * e);

private:
    void readSettings();
    void writeSettings();
};

#endif // LAACAPPLICATION_H
Run Code Online (Sandbox Code Playgroud)

laacapplication.cpp(片段)

void LAACApplication::onApplicationStateChanged(Qt::ApplicationState state)
{
    qDebug() << "void LAACApplication::onApplicationStateChanged(Qt::ApplicationState state =" << state << ")";
    if (Qt::ApplicationSuspended == state)
       writeSettings();
}

bool LAACApplication::event(QEvent *e)
{
    qDebug() << "void LAACApplication::event(QEvent *e =" << e << ")";
    return QApplication::event(e);
}
Run Code Online (Sandbox Code Playgroud)

main.cpp

int main(int argc, char *argv[])
{
    LAACApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QObject::connect(&app, SIGNAL(applicationStateChanged(Qt::ApplicationState)), &app, SLOT(onApplicationStateChanged(Qt::ApplicationState)));

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我没有成功地在信号和插槽之间使用自动连接,因此有一个对QObject::connect().

Fel*_*lix 3

定义“应用程序状态”。在桌面平台上,状态指示您的应用程序是否具有焦点,请参阅 参考资料 了解Qt::ApplicationState详细信息。(例如,如果您选择另一个窗口,它将失去焦点)。这些状态改变应该有效,至少对我来说是这样。它们与应用程序的“生命周期”无关(就像在 Android 上一样)。如果您想在程序退出后立即执行某些操作,请在您的main或使用QCoreApplication::aboutToQuit信号中执行此操作。

对于桌面应用程序,大多数情况下您会忽略状态。例如,可以使用上述方法之一在应用程序退出之前保存设置。但在 Android 上情况有所不同。(有关更多详细信息,请参阅Android 活动。即使您创建 C++-Qt 应用程序,生命周期仍然适用)。据我所知,活动状态中的这些更改不会传递到应用程序,但我从未实际测试过它。如果需要,您始终可以使用本机 java 代码自行实现。请注意,即使您没有收到这些更改的通知,它们仍然会发生,即您的应用程序将停止执行(并在应用程序恢复焦点后立即从停止的位置恢复)。

长话短说:
在桌面平台上,您的应用程序将启动、运行并最终终止,而不会真正暂停(在正常情况下)。仅在程序结束时才需要保存设置。
在 Android 上,“最小化”应用程序会暂停它,但这是自动完成的。

你正在用QSettings吗 ?尝试在进行更改后立即将其存储在那里,这样您就不必担心数据丢失。

关于您的连接问题:连接不会自动完成。有一个名为的函数QMetaObject::connectSlotsByName尝试创建基于名称的连接。如果您在函数内部使用基于 ui 的 Widget 类,它会被自动调用setupUi