Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Маус от Ноябрь 15, 2013, 12:11



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


Название: Re: QWidget::keyPressEvent не ловит обычные клавиши, только служебные
Отправлено: Маус от Ноябрь 15, 2013, 12:49
Оказалось, на виджете расоложен QTreeView, пожирающий нажатия обычных кнопок. Как с минимальными затратами вернуть от него нажатие кнопки?
Запустить в нем свой QWidget::keyPressEvent и отправлять сообщения родителю или есть что-либо попроще?
Или есть ли возможность устанавливать для QtreeView режим, когда он не будет принимать ввод с клавиатуры?


Название: Re: QWidget::keyPressEvent не ловит обычные клавиши, только служебные
Отправлено: Bepec от Ноябрь 15, 2013, 13:02
installEventFilter курите в ассистенте. И да, на все view фильтр нужно ставить на viewport().



Название: Re: QWidget::keyPressEvent не ловит обычные клавиши, только служебные
Отправлено: Маус от Ноябрь 15, 2013, 15:43
Сделал пока как писал, вечером почитаю про installEventFilter.
Всем спасибо! Чувствую реальную помощь сообщества: как написал на форум, так в голову сразу правильные решения нагрянули! ;)


Название: Re: QWidget::keyPressEvent не ловит обычные клавиши, только служебные
Отправлено: Маус от Ноябрь 15, 2013, 16:18
installEventFilter есть только в QDialog, а в QWidget нет такого метода и да, после того, как я натравил на QWidget метод keyPressEvent, забарахлил eventFilter, стоящий в QDialog (создаваемый у меня из QWidget-a). Т.е. если открыть QDialog, то в нем все прекрасно работает, перевожу курсор клавы (фокус ввода) на QWidget, там тоже всё прекрасно работает, возвращаю фокус ввода на QTreeView, расположенный на QDialog-e - нифига не работает. Смещаю фокус на QDialog - здесь работает. Фишка в том, что здесь я не могу переопределить метод keyPressEvent, т.к. используется чистый класс QTreeView (не переопределенный).
Что делать?


Название: Re: QWidget::keyPressEvent не ловит обычные клавиши, только служебные
Отправлено: Old от Ноябрь 15, 2013, 16:21
Не говорите ерунду. :)
installEventFilter есть начиная с QObject во всех его потомках.


Название: Re: QWidget::keyPressEvent не ловит обычные клавиши, только служебные
Отправлено: Alex Custov от Ноябрь 15, 2013, 16:42
Что делать?

Использовать installEventFilter


Название: Re: QWidget::keyPressEvent не ловит обычные клавиши, только служебные
Отправлено: Маус от Ноябрь 16, 2013, 19:37
еще раз: installEventFilter +eventFilter не берет дочернюю область. Т.е. виджет QDialog он отрабатывает а вот на "дочке" QTreeView клавиатура не "ловится"


Название: Re: QWidget::keyPressEvent не ловит обычные клавиши, только служебные
Отправлено: Bepec от Ноябрь 16, 2013, 20:03
installEventFilter курите в ассистенте. И да, на все view фильтр нужно ставить на viewport().




Название: Re: QWidget::keyPressEvent не ловит обычные клавиши, только служебные
Отправлено: michael1960 от Ноябрь 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;
    }
  }
}


Название: Re: QWidget::keyPressEvent не ловит обычные клавиши, только служебные
Отправлено: Nidxogg от Ноябрь 16, 2013, 21:31
"Папы" пришли советовать.
Лучше бы сделали how to по наиболее часто задаваемым вопросам.