Russian Qt Forum
Ноябрь 25, 2024, 07:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QWidget::keyPressEvent не ловит обычные клавиши, только служебные  (Прочитано 7729 раз)
Маус
Гость
« : Ноябрь 15, 2013, 12:11 »

QWidget::keyPressEvent не ловит мЫшей клавиши 0-9 и А-Я (A-Z), а все служебные кнопки, энтеры, стрелки, шифты, капсы, намлоки и т.д. ловит. Как заставить его ловить обычные кнопки, Qt::Key_1 например?
Версия Qt 4.6.1 коммерческая, MS Visual Сыр++ 2008.
« Последнее редактирование: Ноябрь 15, 2013, 12:14 от Маус » Записан
Маус
Гость
« Ответ #1 : Ноябрь 15, 2013, 12:49 »

Оказалось, на виджете расоложен QTreeView, пожирающий нажатия обычных кнопок. Как с минимальными затратами вернуть от него нажатие кнопки?
Запустить в нем свой QWidget::keyPressEvent и отправлять сообщения родителю или есть что-либо попроще?
Или есть ли возможность устанавливать для QtreeView режим, когда он не будет принимать ввод с клавиатуры?
Записан
Bepec
Гость
« Ответ #2 : Ноябрь 15, 2013, 13:02 »

installEventFilter курите в ассистенте. И да, на все view фильтр нужно ставить на viewport().

Записан
Маус
Гость
« Ответ #3 : Ноябрь 15, 2013, 15:43 »

Сделал пока как писал, вечером почитаю про installEventFilter.
Всем спасибо! Чувствую реальную помощь сообщества: как написал на форум, так в голову сразу правильные решения нагрянули! Подмигивающий
Записан
Маус
Гость
« Ответ #4 : Ноябрь 15, 2013, 16:18 »

installEventFilter есть только в QDialog, а в QWidget нет такого метода и да, после того, как я натравил на QWidget метод keyPressEvent, забарахлил eventFilter, стоящий в QDialog (создаваемый у меня из QWidget-a). Т.е. если открыть QDialog, то в нем все прекрасно работает, перевожу курсор клавы (фокус ввода) на QWidget, там тоже всё прекрасно работает, возвращаю фокус ввода на QTreeView, расположенный на QDialog-e - нифига не работает. Смещаю фокус на QDialog - здесь работает. Фишка в том, что здесь я не могу переопределить метод keyPressEvent, т.к. используется чистый класс QTreeView (не переопределенный).
Что делать?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Ноябрь 15, 2013, 16:21 »

Не говорите ерунду. Улыбающийся
installEventFilter есть начиная с QObject во всех его потомках.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Ноябрь 15, 2013, 16:42 »

Что делать?

Использовать installEventFilter
Записан
Маус
Гость
« Ответ #7 : Ноябрь 16, 2013, 19:37 »

еще раз: installEventFilter +eventFilter не берет дочернюю область. Т.е. виджет QDialog он отрабатывает а вот на "дочке" QTreeView клавиатура не "ловится"
Записан
Bepec
Гость
« Ответ #8 : Ноябрь 16, 2013, 20:03 »

installEventFilter курите в ассистенте. И да, на все view фильтр нужно ставить на viewport().


Записан
michael1960
Гость
« Ответ #9 : Ноябрь 16, 2013, 20:40 »

Может быть, такое решение Вам подойдёт:

Данное решение работает в Windows, в Linux и Mac, и не зависит от компилятора. А также, не зависит от версии Qt.

Код:
void <Имя вашего класса>::keyPressEvent(QKeyEvent *event)
{
  Qt::KeyboardModifiers myModifiers = event->modifiers();
  if((myModifiers == Qt::ControlModifier) || (myModifiers == Qt::ShiftModifier) || (myModifiers == Qt::AltModifier)) {
    int state;
    switch(myModifiers) {
    case Qt::ControlModifier :
      state = Qt::ControlButton;
      break;
    case Qt::ShiftModifier :
      state = Qt::ShiftButton;
      break;
    case Qt::AltModifier :
      state = Qt::AltButton;
      break;
    }
    int key = event->key();
    switch(key) {
    case Qt::Key_PageUp :
    case Qt::Key_PageDown :
    case Qt::Key_End :
    case Qt::Key_Home :
      KeyStat(state, key);
      event->ignore();
      break;
    default :
      event->accept();
      break;
    }
  }
  QString t = event->text();
  if((!t.isEmpty()) && (t.at(0).isPrint())) {
    int s = t.at(0).toAscii();
    KeyChar(s);
  } else {
    int key = event->key();
    switch(key) {
    case Qt::Key_Left :
    case Qt::Key_Right :
    case Qt::Key_PageUp :
    case Qt::Key_PageDown :
    case Qt::Key_Insert :
    case Qt::Key_Delete :
    case Qt::Key_Backspace :
    case Qt::Key_Tab :
    case Qt::Key_Home :
    case Qt::Key_End :
    case Qt::Key_Up :
    case Qt::Key_Down :
    case Qt::Key_F1 :
    case Qt::Key_F2 :
    case Qt::Key_F3 :
    case Qt::Key_F4 :
    case Qt::Key_F5 :
    case Qt::Key_F6 :
    case Qt::Key_F7 :
    case Qt::Key_F8 :
    case Qt::Key_F9 :
    case Qt::Key_F10 :
    case Qt::Key_Enter :
    case Qt::Key_Return :
    case Qt::Key_Escape :
      KeyChar(key);
      break;
    default :
      break;
    }
  }
}
Записан
Nidxogg
Гость
« Ответ #10 : Ноябрь 16, 2013, 21:31 »

"Папы" пришли советовать.
Лучше бы сделали how to по наиболее часто задаваемым вопросам.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.124 секунд. Запросов: 22.