在QT中处理左右键事件

时间:2012-06-08 02:33:03

标签: qt keyevent

我的一个QT窗口中有一个QTabWidget,它似乎吞下了左/右按键事件。在主窗口中,我有以下功能:

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

当我按下除左或右之外的任何键时,处理程序将关闭并将键代码打印到控制台。当我向左或向右按​​下时,它会移动到选项卡小部件中的下一个左(或右)选项卡,而VisionWindow的{​​{1}}方法永远不会触发。

我试图通过一个忽略该事件的子类来解决这个问题:

keyPressEvent

与主窗口类似,仅在按下左或右按键时调用此窗口。我也看到基于焦点的位置,有时向左或向右击中会将焦点切换到主窗口中的不同小部件,如复选框。如果有办法收回左右键,或者我应该接受这些在默认情况下在QT中被广泛使用并切换到别的东西?

更新

我最终在我的窗口构造函数中使用class KeylessTabWidget : public QTabWidget { public: KeylessTabWidget(QWidget* parent) : QTabWidget(parent) {} void keyPressEvent(QKeyEvent* event) { event->ignore(); std::cout << "ignored an event\n"; } }; #include <QApplication>。缺点是标签小部件仍在切换标签。 This seems to be a linux issue。从好的方面来说,我能够捕获所有关键事件。我正在让子窗口小部件吞下其他键的事件,这解决了它。

2 个答案:

答案 0 :(得分: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);)

答案 1 :(得分:0)

我想添加更多内容,如果你想避免QtWidgetTab对象不切换标签,只需添加return true:

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-&gt; installEventFilter(this);