我开始使用Qt,但应用程序状态对我来说不太清楚。我使用的是Qt 5.5版本。目前我在Windows上学习,但下一步是要移植到Android设备上,因此我需要关注应用程序状态。
我创建了自己的派生于QApplication
的类,并注册了applicationStateChanged
信号。我猜测当信号被触发时,我应该保留我的配置部分。另外,由于我想要使用QML,我可能也需要使用Qt.labs.settings
。
很明显,我做错了几件事情。
首先,我没有接收到任何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
(fragments)
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()
。