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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как сделать перемещение курсора с клавиатуры в пределах окна программы?  (Прочитано 9775 раз)
Crazy Sage
Гость
« : Март 06, 2009, 10:39 »

Надо сделать перемещение по стрелкам на 1 пиксель, с шифтом на 10
Насколько я понимаю надо сделать следующий обработчик:
Код:
void MainForm::keyEvent (QKeyEvent *event)
{switch (event->key()) {
    case Key_Up:
        if (event->state() & ShiftButton)
  //???
          event->accept();
        else
  //???
          event->accept();
        break;
//обработка еще 3х вариантов
    default: QWidget::keyPressEvent(event);
  }
}

но вот как сделать собственно смещение курсора и отслеживание его выхода за пределы главного окна?
и как прицепить данный обработчик к главному окну, чтобы он вызывался каждый раз при нажатии на клавиатуру, если фокус
ввода на программе?

PS. QT версии 3, возможности перейти на 4ю нет.

UPD: или для таких целей лучше использовать QAction с горячей кнопкой вида Key_Up \ SHIFT + Key_Up?
тогда остается только вопрос про то, как смещать курсор и отслеживать выход за пределы окна
« Последнее редактирование: Март 06, 2009, 11:24 от Crazy Sage » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Март 06, 2009, 21:18 »

выход за пределы окна - leaveEvent()
двигаем курсор - QCursor::setPos(QCursor::pos()+QPoint(1,1))

фокус ввода бывает на окне, а не на программе. Если твоё окно в фокусе, оно будет получать нажатия клавиш, если нет то нет.
Записан
Crazy Sage
Гость
« Ответ #2 : Март 10, 2009, 08:42 »

Похоже я что-то не понимаю в обработке сигналов в QT

Решил для проверки сделать простейший обработчик, который ловит нажатие одной конкретной клавиши и сообщает, что поймал.
Код выглядит следующим образом

в .h файле главного окна:
Код:
protected:
void keyPressEvent(QKeyEvent *e);

в .cpp файле главного окна:
Код:
void MainForm::keyPressEvent (QKeyEvent *event)
{
if (event->key()==Qt::Key_Z)
{
qDebug("Event accepted");
event->accept();
}
else
{
event->ignore();
}
}

в коде главного виджета - аналогично, только вместо Key_Z другая клавиша
реакции на нажатие этих клавиш - ноль. Что я делаю не так?
Записан
igor_bogomolov
Гость
« Ответ #3 : Март 10, 2009, 10:14 »

В приведенном вами примере все нормально, код рабочий. Возможно дело в том, что до MainForm событие не доходит. Например из-за того что фокус находится на другом виджете, ну например QTextEdit или QDataTime.
Записан
Crazy Sage
Гость
« Ответ #4 : Март 10, 2009, 10:42 »

А можно ли как-то узнать, кто ловит сигнал?
Очевидных QT'шных виджетов с клавиатурным вводом в программе нет, наши виджеты я вроде все проверил, клавиатуру никто не ловит.
« Последнее редактирование: Март 10, 2009, 10:50 от Crazy Sage » Записан
igor_bogomolov
Гость
« Ответ #5 : Март 10, 2009, 10:50 »

Например, у меня на форме находится QTextEdit. Если фокус находится на этом виджете, он сам обрабатывает события нажатия клавиатуры, и дальше их не пропускает. Для того чтобы отловить нужное событие мне пришлось добавить eventFilter
textEdit->installEventFilter(this);

Код:
bool MainForm::eventFilter(QObject *target, QEvent *event) {
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        if(keyEvent->key()==Qt::Key_Z)
            qDebug("Event accepted");
        return QObject::eventFilter(target, event);
    }
    return QObject::eventFilter(target, event);
}


Попробуй сделать также, что получится?
Здесь же можно узнать кто принимает событие нажатия клавиатуры.

P.S. Админам. Какие то краказыбры появляются после редактирования кода cpp
« Последнее редактирование: Март 10, 2009, 10:58 от igor_bogomolov » Записан
Crazy Sage
Гость
« Ответ #6 : Март 10, 2009, 11:17 »

на строку
if (event->type() == QEvent::KeyPress)

выдает
error: expected unqualified-id before numeric constant
error: expected `)' before numeric constant
Записан
BRE
Гость
« Ответ #7 : Март 10, 2009, 11:20 »

на строку
if (event->type() == QEvent::KeyPress)

выдает
error: expected unqualified-id before numeric constant
error: expected `)' before numeric constant

А ты QEvent подключи:
#include <QEvent>
Записан
igor_bogomolov
Гость
« Ответ #8 : Март 10, 2009, 11:26 »

или #include <QtGui/QKeyEvent>. Этого должно быть достаточно
Записан
Crazy Sage
Гость
« Ответ #9 : Март 10, 2009, 11:32 »

Вобще qevent.h подключен
А этот код он для 3й или для 4й версии QT?
Потому что у меня 3я.
Записан
igor_bogomolov
Гость
« Ответ #10 : Март 10, 2009, 11:34 »

У меня Qt 4.5.0
Для 3й не знаю, не могу подсказать
Записан
Crazy Sage
Гость
« Ответ #11 : Март 10, 2009, 11:36 »

Ага. Ну во всяком случае ясно, в чем проблема. Буду разбираться с фильтрами в третьем QT
Записан
igor_bogomolov
Гость
« Ответ #12 : Март 10, 2009, 12:13 »

Нашел в книге Макса Шлее. Нужно переопределить метод event().

Код
C++ (Qt)
bool MainForm::event(QEvent *e) {
   if(e->type() == QEvent::KeyPress) {
       QKeyEvent *keyEvent = (QKeyEvent *) e;
       if(keyEvent->key() == Key_Z) {
            qDebug("Event accepted");  
            return QWidget::event(e);
       }
   }
   return QWidget::event(e);
}
Записан
Crazy Sage
Гость
« Ответ #13 : Март 10, 2009, 12:36 »

В итоге.
Компилятор упорно ругается на QEvent::KeyPress, хотя qevent.h подключен и компилятор его спокойно обнаруживает.
Пока что заменил QEvent::KeyPress на 6, хотя не уверен, что это корректно.
Ни с установкой eventFilter ни с переопределением event() клавиши не ловятся. Видимо буду ждать пока появится главный разработчик и спрашивать у него, что может перехватывать клавиатуру.
Записан
igor_bogomolov
Гость
« Ответ #14 : Март 10, 2009, 13:06 »

В архиве два примера из книги Шлее. Может они помогут разобраться в чем проблема. У самого тройки нет, так что не знаю чем еще помочь.
« Последнее редактирование: Март 10, 2009, 13:09 от igor_bogomolov » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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