2012-09-11 240 views
3

在我的Qt應用程序中,我正在關閉應用程序時保存一些數據。保存數據在closeEvent(QCloseEvent *)方法中執行。我想在保存數據前更改光標,並在保存後將其恢復。更改光標隱藏光標

從我在互聯網上讀到的setCursor(const QCursor &)不能全局工作,但只能在某個指定的小部件的範圍內。因此我嘗試使用WinAPI中的SetCursor(HCURSOR)。

的代碼看起來是這樣的:

void mainWin::closeEvent(QCloseEvent* e) { 
    SetCursor(LoadCursor(GetModuleHandle(NULL), (LPCWSTR)IDC_WAIT)); 
    saveData(); 
    SetCursor(LoadCursor(GetModuleHandle(NULL), (LPCWSTR)IDC_ARROW)); 
    e->accept(); 
} 

然而,第一的setCursor()方法只是隱藏光標當數據而不是保存其更改爲某種沙漏的時間。爲什麼?

回答

3

你應該使用QApplication::setOverrideCursor,它會改變你的整個應用程序的光標。

QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); 
saveData(); 
QApplication::restoreOverrideCursor(); 

你當然可以提供你自己的像素圖,當你創建你的光標。 你可以做的另一件有趣的事情是創建一個RAII類來處理自定義遊標。您在構造函數中調用setOverrideCursor,並在析構函數中調用restoreOverrideCursor。這樣做非常方便,當您想要更改光標並在範圍末尾自動恢復它時有很多地方。另一個優點是,如果saveData方法拋出,則無論如何都會重置光標,這非常好。

+0

我擔心我必須傳遞一些指向QApplication對象的指針,但它甚至是靜態的!謝謝。順便說一下,你知道爲什麼使用WinAPI隱藏遊標嗎?只是好奇心。 – tobi

+2

當您包含QApplication時,QApplication指針始終可用。您可以通過qApp宏或QApplication :: instance靜態方法來訪問它。 –