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) )

或者我可能会按照here所述查看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

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);
}

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();
}

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

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

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

简短的故事:在桌面平台上,您的应用程序将启动,运行并最终终止而不会实际暂停(在正常情况下).只有在程序结束时才需要保存设置.
在Android上,“最小化”应用程序将暂停它,但这是自动完成的.

你在使用QSettings吗?尝试在更改后立即存储更改,您不必担心数据丢失.

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

点赞