2015-11-09 104 views
2

我從Qt開始,對於應用程序狀態我不清楚。我使用Qt 5.5。我目前在Windows上學習,但Android設備是下一步,因此我關注應用程序狀態。Qt應用程序狀態生命週期

我已經創建了我自己的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()如說,爲了執行這樣的任務here

所以,要簡短:我應該如何處理應用程序狀態更改與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

順便說一句,我沒有成功地使用我的信號和我的插槽之間的自動連接,因此有一個明確的電話QObject::connect()

+0

(來自編輯隊列re [this edit](http://stackoverflow.com/review/suggested-edits/13526506))這裏的慣例是在句子結尾和相應的問號之間不要留空格。我已經改進了您的編輯以刪除這些空格,認爲它可能對您瞭解原因很有用。 – jaggedSpire

回答

2

定義「應用程序狀態」。在桌面平臺上,狀態顯示您的應用程序是否有焦點,詳情請參閱Qt::ApplicationState。 (例如,如果您選擇另一個窗口,它將失去焦點)。這些狀態的變化應該起作用,至少他們是爲我做的。它們與應用程序的「生命週期」無關(就像在Android上一樣)。如果您想在程序退出後立即執行某些操作,請在main中執行此操作,或使用QCoreApplication::aboutToQuit信號。

對於桌面應用程序,在大多數情況下您將忽略該狀態。例如,可以在應用程序退出之前完成保存設置,使用上述方法之一。在Android上,但它是不同的。 (有關更多詳細信息,請參閱Android Activity即使您創建了C++ -Qt應用程序,生命週期仍然適用)。據我所知,活動狀態的變化是而不是傳遞給應用程序,但我從來沒有真正測試過它。如果您需要它,您可以使用原生Java代碼自行實施它。請注意,即使您沒有收到有關更改的通知,它們仍然會發生,即您的應用程序將停止執行(並在應用程序重新啓動後立即停止執行)。

長短篇小說:
在桌面平臺上,你的應用程序將啓動,運行,最終沒有實際不斷beeing終止暫停(正常情況下)。只有在程序結束時才需要保存設置。
在Android上,「最小化」應用程序會暫停它,但這是自動完成的。

你使用的是QSettings?嘗試在製作完成後立即保存更改,而不必擔心數據丟失。

而關於你的連接問題:連接是不是自動完成。有一個名爲QMetaObject::connectSlotsByName的函數試圖創建一個基於名稱的連接。如果您在setupUi函數中使用基於UI的Widget類,它會自動調用。

+0

謝謝。我的問題是關於正確使用應用程序狀態生命週期的Qt框架解釋。我的猜測是,Qt被設計爲方便地回答現實生活中的問題。包括我不知道的問題。爲了從這項工作中受益,我必須正確使用Qt框架。例如,我在Android上編寫了一個帶有Java的小原型,並且我必須處理應用程序狀態。在計算過程中,我的瞬態數據「自動」完成了什麼?應該針對同時面向桌面和Android的應用捕獲什麼消息? –

+0

好吧,這不是那麼容易 - 要麼讓Qt處理應用程序狀態(並且你只是不在乎數據會發生什麼 - 因爲它工作),或者你自己實現plattform特定的解決方案。我會建議第一個,直到你明確需要特殊行爲 – Felix

相關問題