【问题标题】:Qt Application state lifecycleQt 应用程序状态生命周期
【发布时间】:2015-11-09 17:50:58
【问题描述】:

我从 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()的显式调用。

【问题讨论】:

  • (from the edit queue re this edit) 这里的约定是在句尾和相应的问号之间不留空格。我已经改进了您的编辑以删除这些空格,想知道原因可能对您有用。

标签: c++ qt


【解决方案1】:

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

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

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

你在使用QSettings吗?尝试在更改完成后立即将其存储在那里,您不必担心数据丢失。

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

【讨论】:

  • 谢谢。我的问题是关于正确使用 Qt 框架对应用程序状态生命周期的解释。我的猜测是 Qt 旨在方便地回答现实生活中的问题。包括我不知道的问题。为了从这项工作中受益,我必须正确使用 Qt 框架。例如,我在 Android 上使用 Java 编写了一个小型原型,我必须处理应用程序状态。在计算过程中,我的瞬态数据“自动”做了什么?对于同时面向桌面和 Android 的应用程序,我应该捕获哪些消息?
  • 嗯,这不是那么容易——要么让 Qt 处理应用程序状态(你只是不关心你的数据会发生什么——因为它可以工作),或者你自己实现平台特定的解决方案.我会推荐第一个,直到您明确需要特殊行为
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多