2

私は Qt の初心者で、1 か月ほど対処できない問題が 1 つあります。状況は次のとおりです。OpenSceneGraph プロジェクト (OpenGL) を作成し、3D シーン内で Qt インターフェイスを作成しようとしています。私はそれをどのように処理するかは必要ないと思いますが、誰かがもっと知りたい場合、OSG フォーラムのスレッドで詳細情報を確認してください (ただし、そこで解決策は得られませんでした)。問題は、キーボードの任意のキーがクリックされると、Qt コントロールが画面を飛び回り、(マウスまたはキーボード) イベントに反応しなくなることです。ただし、プログラム全体は引き続き機能します。要約すると、私の質問は次のようなものです: Qt ウィジェットにすべてのキー押下を無視させる方法はありますか? 私はたくさん検索しましたが、有効な解決策を見つけることができませんでした。

前もって感謝します!

4

1 に答える 1

2

Qt のイベントについて少し読んでください。イベント フィルタリングに関するセクションがあります (ただし、すぐにジャンプしないでください:P)。

簡潔な答え :

void Qwidget::setEnabled (ブール値);

欠点は、マウスイベントも無効にし、ウィジェットのスタイルを変更することです。これは残念なことです。

長い回答: イベントをフィルタする

1 つの可能性は、Qt アプリケーションですべてのイベントをフィルタリングすることです。Qtコードを起動する関数は次のようになると思います(ここに別の投稿がある場合):

int main(int argc, char* argv[]){
    QApplication app(argc, argv);
    QWidget toplevelwidget1;
    toplevelwidget1.show()
    //stufff
    return app.exec();
} 
//doesnt have to exactly like this.

変数にイベント フィルタを設定できます。appこれはより洗練されたソリューションですが、ネイティブ イベントをフィルタリングし、いくつかの作業が必要になるため、複雑すぎます...

代わりにできることは、最上位のウィジェットまたはウィンドウ(親のないもの) のみをフィルタリングすることです。QObject次のようなイベント フィルタ ( ) を定義します。

class KeyboardFilter: public QObject
{
   Q_OBJECT
   ...

   protected:
     bool eventFilter(QObject *obj, QEvent *event);
 };

  bool KeyboardFilter::eventFilter(QObject *obj, QEvent *event)
  {
      //for all events from keyboard, do nothing
      if (event->type() == QEvent::KeyPress || 
          event->type() == QEvent::KeyRelease ||
          event->type() == QEvent::ShortcutOverride ||
          ) {
          return true;
      } else {
        // for other, do as usual (standard event processing)
        return QObject::eventFilter(obj, event);
      }
  }

次に、以下を使用して目的のウィジェットにフィルターを設定します。

 myDesiredWidgetorObject->installEventFilter(new KeyboardFilter(parent));

以上です!

于 2012-10-17T11:06:08.440 に答える