【问题标题】:Handling left and right key events in QTQT中处理左右键事件
【发布时间】:2012-06-12 03:09:26
【问题描述】:

我的一个 QT 窗口中有一个 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 &lt;QApplication&gt;qApp-&gt;installEventFilter(this);。缺点是选项卡小部件仍在切换选项卡。 This seems to be a linux issue。从好的方面来说,我能够捕获所有关键事件。我的事件也被其他键的子小部件吞噬,这解决了它。

【问题讨论】:

  • 尝试事件处理机制...可能这些左右键事件已经在 Keypressevent 之前处理了。

标签: qt keyevent


【解决方案1】:

尝试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;
}

安装这个事件过滤器。(qApplicationobject-&gt;installEventFilter(this);)

【讨论】:

  • 这很有帮助。我在更新中添加了有关该解决方案的更多信息。谢谢!
【解决方案2】:

我想补充一点,如果你想避免 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->installEventFilter(this);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多