首页 文章

在QT中处理左右键事件

提问于
浏览
1

我的一个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中被广泛使用并默认切换到其他东西?

Update:

我最终在我的窗口构造函数中使用 #include <QApplication>qApp->installEventFilter(this); . 缺点是标签小部件仍在切换标签 . This seems to be a linux issue . 从好的方面来说,我能够捕获所有关键事件 . 我正在让子窗口小部件吞下其他键的事件,这解决了它 .

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);)

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

相关问题