Russian Qt Forum

Qt => Общие вопросы => Тема начата: Crazy Sage от Март 06, 2009, 10:39



Название: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: 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?
тогда остается только вопрос про то, как смещать курсор и отслеживать выход за пределы окна


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: Alex Custov от Март 06, 2009, 21:18
выход за пределы окна - leaveEvent()
двигаем курсор - QCursor::setPos(QCursor::pos()+QPoint(1,1))

фокус ввода бывает на окне, а не на программе. Если твоё окно в фокусе, оно будет получать нажатия клавиш, если нет то нет.


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: Crazy Sage от Март 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 другая клавиша
реакции на нажатие этих клавиш - ноль. Что я делаю не так?


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: igor_bogomolov от Март 10, 2009, 10:14
В приведенном вами примере все нормально, код рабочий. Возможно дело в том, что до MainForm событие не доходит. Например из-за того что фокус находится на другом виджете, ну например QTextEdit или QDataTime.


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: Crazy Sage от Март 10, 2009, 10:42
А можно ли как-то узнать, кто ловит сигнал?
Очевидных QT'шных виджетов с клавиатурным вводом в программе нет, наши виджеты я вроде все проверил, клавиатуру никто не ловит.


Название: Re: Как сделать перемещение курсора с клавиа&
Отправлено: igor_bogomolov от Март 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


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: Crazy Sage от Март 10, 2009, 11:17
на строку
if (event->type() == QEvent::KeyPress)

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


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: BRE от Март 10, 2009, 11:20
на строку
if (event->type() == QEvent::KeyPress)

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

А ты QEvent подключи:
#include <QEvent>


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: igor_bogomolov от Март 10, 2009, 11:26
или #include <QtGui/QKeyEvent>. Этого должно быть достаточно


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: Crazy Sage от Март 10, 2009, 11:32
Вобще qevent.h подключен
А этот код он для 3й или для 4й версии QT?
Потому что у меня 3я.


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: igor_bogomolov от Март 10, 2009, 11:34
У меня Qt 4.5.0
Для 3й не знаю, не могу подсказать


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: Crazy Sage от Март 10, 2009, 11:36
Ага. Ну во всяком случае ясно, в чем проблема. Буду разбираться с фильтрами в третьем QT


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: igor_bogomolov от Март 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);
}


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: Crazy Sage от Март 10, 2009, 12:36
В итоге.
Компилятор упорно ругается на QEvent::KeyPress, хотя qevent.h подключен и компилятор его спокойно обнаруживает.
Пока что заменил QEvent::KeyPress на 6, хотя не уверен, что это корректно.
Ни с установкой eventFilter ни с переопределением event() клавиши не ловятся. Видимо буду ждать пока появится главный разработчик и спрашивать у него, что может перехватывать клавиатуру.


Название: Re: Как сделать перемещение курсора с клавиа&
Отправлено: igor_bogomolov от Март 10, 2009, 13:06
В архиве два примера из книги Шлее. Может они помогут разобраться в чем проблема. У самого тройки нет, так что не знаю чем еще помочь.


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: Crazy Sage от Март 10, 2009, 15:23
спасибо


Название: Re: Как сделать перемещение курсора с клавиатуры в пределах окна программы?
Отправлено: Crazy Sage от Март 11, 2009, 10:12
Проблема, как водится, оказалась тупой до нельзя. В KDevelop'е слетел путь к исполняемому файлу на каталог с предыдущей версией программы, поэтому все изменения, которые я вносил не влияли на запускаемый файл.
Всем спасибо за участие.