我有一个QTabWidget在我的QT窗口中,它似乎吞下了左/右按键事件.在主窗口中,我有以下功能:
void VisionWindow::keyPressEvent(QKeyEvent* event) {
std::cout << event->key() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
当我按下除左或右之外的任何键时,处理程序将关闭并将键代码打印到控制台.当我按下左边或右边,它移动到下一个左侧的标签窗口小部件(或右)选项卡和VisionWindow的keyPressEvent方法永远不会触发.
我试图用一个忽略该事件的子类来解决这个问题:
class KeylessTabWidget : public QTabWidget {
public:
KeylessTabWidget(QWidget* parent) : QTabWidget(parent) {}
void keyPressEvent(QKeyEvent* event) { event->ignore(); std::cout << "ignored an event\n"; }
};
Run Code Online (Sandbox Code Playgroud)
与主窗口类似,只有在按下左或右按键时才会调用此窗口.我也看到基于焦点的位置,有时向左或向右击中会将焦点切换到主窗口中的不同小部件,如复选框.如果有任何方法可以回收左右键,或者我应该接受这些在QT中被广泛使用并默认切换到其他东西?
更新:
最后我用#include <QApplication>一起qApp->installEventFilter(this);在我的窗口构造.缺点是标签小部件仍在切换标签.这似乎是一个linux问题.从好的方面来说,我能够捕获所有关键事件.我正在让子窗口小部件吞下其他键的事件,这解决了它.
尝试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;
}
Run Code Online (Sandbox Code Playgroud)
安装此eventfilter.(qApplicationobject->installEventFilter(this);)