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() メソッドは、カーソルをある種の砂時計に変更するのではなく、データが保存されている間だけ非表示にします。なんで?

4

1 に答える 1

3

を使用する必要がありますQApplication::setOverrideCursor。これにより、アプリケーション全体のカーソルが変更されます。

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

もちろん、カーソルを作成するときに独自のピックスマップを提供できます。できるもう 1 つの興味深いことは、カスタム カーソルを処理する RAII クラスを作成することです。setOverrideCursorコンストラクタで呼び出しrestoreOverrideCursor、デストラクタで呼び出します。カーソルを変更し、スコープの最後に自動的に復元したい場所がたくさんある場合、これは非常に便利です。もう 1 つの利点は、saveDataメソッドがスローした場合にカーソルがリセットされることです。これは非常に優れています。

于 2012-09-11T09:46:46.817 に答える