2012-06-08 2 views
1

У меня есть QTabWidget в одном из моих окон QT, и, похоже, он проглатывает события нажатия клавиш влево/вправо. В главном окне У меня есть следующие функции:Обработка событий влево и вправо в QT

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. С положительной стороны, я могу захватить все ключевые события. У меня были события, проглоченные дочерними виджетами и для других ключей, и это решило это.

+0

Пробовать механизм обработчика событий ... Возможно, эти левые и правые ключевые события уже обработаны перед нажатием клавиши. – ScarCode

ответ

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

Это очень помогло. Я добавил дополнительную информацию об этом решении. Благодаря! – Jake

0

Я хотел бы добавить что-то еще, если вы хотите, чтобы избежать объекта QtWidgetTab, чтобы не переключать вкладки, просто добавьте возвращающие:

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 (это);