2011-07-05 56 views
7

現在、私はQtプログラムを作成中です。長いタスクが実行されているアプリケーションとの相互作用からユーザーを防ぐために、私はしかし ​​ Qt - カーソルを砂時計に変更してカーソルを無効にする

を呼び出すことによって overriding the cursorを試してみました、マウスクリックイベントが無効になっていません。

GUIのすべてのウィジェットを無効にせずにマウスクリックイベントを無効にする方法はありますか?

答えて

8

私はに実際にへの道を見つけるのに多くの時間を費やしましたが、Qtでのユーザーのやりとりを防ぎ、イベントフィルタリングが容認できる解決策であると思われます。

ここでは例:

qapp->setOverrideCursor(Qt::WaitCursor); 
qapp->installEventFilter(filter); 

そしてロックを解除:

while(qapp->overrideCursor()) //be careful application may have been lock several times ... 
    qapp->restoreOverrideCursor(); 
qapp->removeEventFilter(filter); 
0

setOverrideCursurは、カーソルの外観のみを変更します。 ユーザ入力を無効にするには、イベントループで進行状況ダイアログをポップアップするか、マウス/キーボードイベントをフィルタすることができます。

0

私のアプリケーションに役立つ別のアプローチがあります:ユーザーイベントが処理されている間、新しいマウスクリック/ボタンの押下は通常、現在実行中のタスクがQ(コア)Application :: processEvents()を呼び出すときにのみ処理されます。これはしばしば再描画を強制するために使用されます。プログレスバーが変更されたとき。これは含まれているQtベースの第三者ライブラリの一部でもあることに注意してください。

タスクが完了した後、あなたの長い作業中に発生するマウスクリックが処理されます

QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); 

にこれらの呼び出しを変更した場合。もちろん、ユーザーの入力イベントを遅延させたくない場合があるので、processEvents()呼び出しごとにチェックする必要があります。

サードパーティのlibsにprocessEvents()呼び出しがあり、それらを変更できない場合は、私が恐れる同じ問題に悩まされます。

+0

のprocessEventsあなたがQuit-を受ける場合は特に、トリッキーなことができますどのようにロックするが、その後

class AppFilter : public QObject { protected: bool eventFilter(QObject *obj, QEvent *event); }; bool AppFilter::eventFilter(QObject *obj, QEvent *event) { switch (event->type()) { //list event you want to prevent here ... case QEvent::KeyPress: case QEvent::KeyRelease: case QEvent::MouseButtonRelease: case QEvent::MouseButtonPress: case QEvent::MouseButtonDblClick: //... return true; } return QObject::eventFilter(obj, event); } 

processEvents内の通知。マウスイベントのほかに、キーボードイベントもフィルタリングされます。したがって、アプリケーションの終了も無効にすることができます。 – Jens

+0

長いタスクの中断は確かに問題です。あなたがそれを望むなら、私自身のイベントループが唯一の可能性であると思います。 –

関連する問題