2012-09-11 174 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静态方法来访问它。 –