У меня есть QTabWidget
в одном из моих окон QT, и, похоже, он проглатывает события нажатия клавиш влево/вправо. В главном окне У меня есть следующие функции:Обработка событий влево и вправо в QT
void VisionWindow::keyPressEvent(QKeyEvent* event) {
std::cout << event->key() << "\n";
}
При нажатии на любую клавишу, кроме влево или вправо, обработчик отключается и выводит код ключа на консоль. Когда я нажимаю влево или вправо, он перемещается на следующую левую (или правую) вкладку виджета вкладки, а метод VisionWindow
keyPressEvent
никогда не срабатывает.
Я попытался исправить это с подклассом, который будет игнорировать событие:
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. С положительной стороны, я могу захватить все ключевые события. У меня были события, проглоченные дочерними виджетами и для других ключей, и это решило это.
Пробовать механизм обработчика событий ... Возможно, эти левые и правые ключевые события уже обработаны перед нажатием клавиши. – ScarCode