【发布时间】: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) 这里的约定是在句尾和相应的问号之间不留空格。我已经改进了您的编辑以删除这些空格,想知道原因可能对您有用。