Qt应用程序状态生命周期
Qt Application state lifecycle
我从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) )
或者,为了执行这样的任务,我应该研究这里所说的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上)。如果您想在程序退出后立即执行某些操作,请在main
中执行或使用QCoreApplication::aboutToQuit
信号。
对于桌面应用程序,在大多数情况下都会忽略状态。例如,使用上面提到的方法之一,可以在应用程序退出之前完成保存设置。然而,在安卓系统上,情况有所不同。(有关更多详细信息,请参阅Android活动。即使您创建了C++-Qt应用程序,生命周期仍然适用)。据我所知,"活动状态"中的这些更改并不是传递给应用程序的,但我从未真正测试过它。如果您需要它,您可以使用本机java代码自己实现它。请注意,即使您没有收到这些更改的通知,它们仍然会发生,即您的应用程序将停止执行(并在应用程序恢复焦点后继续执行停止的位置)。
长话短说:
在桌面平台上,您的应用程序将启动、运行并最终终止,而不会真正暂停(在正常情况下)。只有在程序结束时才需要保存设置
在安卓系统上,"最小化"应用程序会暂停它,但这是自动完成的。
您正在使用QSettings
吗?一旦做出更改,就尝试将其存储在那里,这样您就不必害怕数据丢失。
关于您的连接问题:连接不是自动完成的。有一个名为QMetaObject::connectSlotsByName
的函数试图创建一个基于名称的连接。如果您在setupUi
函数内部使用基于ui的Widget类,则会自动调用它。
- 如何在共享库的整个生命周期内存储数据
- 如何理解句子的生命周期始于对e的评估
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了
- Go/C++gRPC客户端通道和存根生命周期
- 如何将"this"的生命周期移动到C++中的另一个对象中?
- 是否可以通过使用移动/交换 c++11 来延长返回的临时变量的生命周期
- 使用对象的生命周期作为设置器的安全性
- 临时人员的生命周期传递给函数
- 我想知道在构造函数中初始化变量时的生命周期
- Lua 用户数据生命周期管理
- 如何使用 epoll(void* event.data.ptr) 管理 Connection 的生命周期
- C++引用的生命周期
- 在堆栈上有一个对象,而不是在函数的整个生命周期内
- 在 Boost ASIO 服务器中处理生命周期
- C++ lambda 生命周期
- 使用互斥锁跟踪另一个应用的生命周期
- QSharedPointer 或 std::shared_ptr 的生命周期
- 来自async_resolve的 boost::asio::ip::tcp::resolver::iterator 的生命周期是多久?
- 如何调整属于类的唯一指针的字符数组的大小.它必须在程序的整个生命周期中保持活力
- 延长 std::tuple<int&,int> 的生命周期,方法是将其分配给 const std::tuple<int, int>&