1

QTウィンドウの1つにがQTabWidgetあり、左/右のキー押下イベントを飲み込んでいるようです。メインウィンドウには、次の機能があります。

void VisionWindow::keyPressEvent(QKeyEvent* event) {
    std::cout << event->key() << "\n";
}

左または右以外のキーを押すと、ハンドラーがオフになり、キーコードがコンソールに出力されます。左または右を押すと、タブウィジェットの次の左(または右)タブに移動し、VisionWindowkeyPressEventメソッドは起動しません。

イベントを無視するサブクラスでこれを修正しようとしました:

class KeylessTabWidget : public QTabWidget {
    public:
        KeylessTabWidget(QWidget* parent) : QTabWidget(parent) {}
        void keyPressEvent(QKeyEvent* event) { event->ignore(); std::cout << "ignored an event\n"; }
};

メインウィンドウと同様に、これは左または右以外のキーが押された場合にのみ呼び出されます。また、フォーカスの場所に基づいて、左または右を押すと、チェックボックスなど、メインウィンドウの別のウィジェットにフォーカスが切り替わることがあります。左キーと右キーを再利用する方法がある場合、またはこれらがデフォルトでQTで広く使用されていることを受け入れて、別のものに切り替える必要がありますか?

アップデート:

結局、ウィンドウコンストラクターで#include <QApplication>一緒に使用することになりました。qApp->installEventFilter(this);欠点は、タブウィジェットがまだタブを切り替えていることです。これはLinuxの問題のようです。プラス面として、私はすべての重要なイベントをキャプチャすることができます。他のキーの子ウィジェットにもイベントが飲み込まれていたのですが、これで解決しました。

4

2 に答える 2

7

メカニズムを試してくださいevent handler。これらの左右のキーイベントは、Keypresseventの前にすでに処理されている可能性があります。

bool MainWindow::eventFilter(QObject *object, QEvent *e)
{
 if (e->type() == QEvent::KeyPress)
  {
  QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
  std::cout << event->key() << "\n";
  }
 return false;
}

このeventfilterをインストールします。(qApplicationobject->installEventFilter(this);)

于 2012-06-08T03:29:44.040 に答える
0

QtWidgetTabオブジェクトでタブを切り替えないようにしたい場合は、returntrueを追加してください。

bool MyObject::eventFilter(QObject *object, QEvent *ev)
{
 if (e->type() == QEvent::KeyPress)
  {
       QKeyEvent *keyEvent = static_cast<QKeyEvent *>(ev);
       qDebug() << keyEvent->key() ;

      return true; //Here the signal was processed and is not going to be handled by QtTabWidget 
  }

 return false;
}

そして、qApp-> installEventFilter(this);を追加することを忘れないでください。

于 2014-07-17T14:04:59.297 に答える