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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: обработка нажатий клавишь клавиатуры  (Прочитано 25015 раз)
taifun
Гость
« : Декабрь 22, 2009, 13:30 »

Здраствуйте! Есть функция:
Код:
void MainWindow::keyPressEvent(QKeyEvent* event)
{

  switch(event->key())
  {
   case Qt::Key_Up:
      QMessageBox msgBox;
      msgBox.setWindowTitle(trUtf8("Внимание!"));
      msgBox.setText(trUtf8("Уведомление:"));
      msgBox.setInformativeText(trUtf8("Нажата кнопка ВВЕРХ."));
      msgBox.setIcon(QMessageBox::Information);
      msgBox.exec();
      break;

  }
}
ошибок не выдает, все собирается и компилируется, но при нажатии на кнопку со стрелочкой вверх ничего не происходит  Непонимающий
Записан
BRE
Гость
« Ответ #1 : Декабрь 22, 2009, 14:00 »

Скорее всего кто-то из детей это событие обрабатывает.
Записан
taifun
Гость
« Ответ #2 : Декабрь 22, 2009, 14:12 »

Скорее всего кто-то из детей это событие обрабатывает.

Спасибо, но не помогло.... почему кто-то из детей? что не так?
Записан
BRE
Гость
« Ответ #3 : Декабрь 22, 2009, 14:32 »

Спасибо, но не помогло.... почему кто-то из детей? что не так?
Да все так.  Улыбающийся
Такие события сначала доставляются виджетам имеющим фокус ввода, и скорее всего он его обрабатывает. Поэтому, до MainWindow оно и не доходит.
Записан
taifun
Гость
« Ответ #4 : Декабрь 22, 2009, 15:53 »

На форме есть только одна кнопка и виджет, в котором я рисую. События мыши обрабатываются нормально, а от клавиатуры вообще не как  Непонимающий
Записан
BRE
Гость
« Ответ #5 : Декабрь 22, 2009, 16:16 »

void QWidget::keyPressEvent ( QKeyEvent * event )   [virtual protected]

This event handler, for event event, can be reimplemented in a subclass to receive key press events for the widget.

A widget must call setFocusPolicy() to accept focus initially and have focus in order to receive a key press event.

If you reimplement this handler, it is very important that you call the base class implementation if you do not act upon the key.

The default implementation closes popup widgets if the user presses Esc. Otherwise the event is ignored, so that the widget's parent can interpret it.

Note that QKeyEvent starts with isAccepted() == true, so you do not need to call QKeyEvent::accept() - just do not call the base class implementation if you act upon the key.

See also keyReleaseEvent(), setFocusPolicy(), focusInEvent(), focusOutEvent(), event(), QKeyEvent, and Tetrix Example.
Записан
BRE
Гость
« Ответ #6 : Декабрь 22, 2009, 16:31 »

Вот простейший рабочий код:
Код
C++ (Qt)
class MainWindow : public QMainWindow
{
Q_OBJECT
 
public:
MainWindow();
 
protected:
void keyPressEvent( QKeyEvent *event );
};
 
MainWindow::MainWindow()
: QMainWindow( 0 )
{
QWidget *widget = new QWidget( this );
setCentralWidget( widget );
}
 
void MainWindow::keyPressEvent( QKeyEvent *event )
{
switch( event->key() )
{
case Qt::Key_Up:
qDebug() << "Key Up pressed";
break;
 
default:
qDebug() << "Key pressed:" << event->key();
break;
}
}
 
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #7 : Декабрь 22, 2009, 16:47 »

На форме есть только одна кнопка и виджет, в котором я рисую. События мыши обрабатываются нормально, а от клавиатуры вообще не как  Непонимающий
скорее всего у тебя клавиатурные события получает фокусный (тот на котором фокус) виджет.
И это скорее всего кнопка.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Декабрь 22, 2009, 17:01 »

exec крутит свой EventLoop и до MainWindow дело не доходит. Тот же обработчик но для msgBox получит keyPressed 
Записан
taifun
Гость
« Ответ #9 : Декабрь 23, 2009, 12:11 »

Более менее разобрался, покрайней мере достиг нужного результат спасибо! Но хочу спросить вот что:
есть у меня mainwindow.cpp (класс диалогового окна) и gltest.cpp (тут рисую с помощью OpenGL). В mainwindow.cpp в конструкторе пишу

Код:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    wgOpenGL = new glTest(ui->ViewOpenGl);
    ui->ViewOpenGl->setFocusPolicy(Qt::StrongFocus);
    ui->ViewOpenGl->setFocus(Qt::ActiveWindowFocusReason);
}

и обработка событий клавиш
Код:
void MainWindow::keyPressEvent( QKeyEvent *event )
{
    wgOpenGL->keyPressEvent(event);

}

а в gltest.cpp уже обрабатываю:

Код:
void glTest::keyPressEvent(QKeyEvent* event)
{

  switch(event->key())
  {
   case Qt::Key_Up:
    qDebug() << "Key Up pressed!";
        setXRotation(xRot + 5);
    qDebug() << trUtf8("Объект повернут на 10 градусов по оси Х");
    break;

   case Qt::Key_Down:
    qDebug() << "Key Down pressed!";
    setXRotation(xRot - 5);
    break;

   case Qt::Key_Left:
    qDebug() << "Key Left pressed!";
    setYRotation(yRot + 5);
    break;

   case Qt::Key_Right:
    qDebug() << "Key Right pressed!";
    setYRotation(yRot - 5);
    break;

  }

  updateGL();

}

Вот мне кажется, что я чет намудрил, можно проще или нет? можно ли обойтись без этого
Код:
void MainWindow::keyPressEvent( QKeyEvent *event )
{
    wgOpenGL->keyPressEvent(event);
}
Записан
Dendy
Гость
« Ответ #10 : Декабрь 23, 2009, 16:35 »

Да, переопределить keyPressedEvent() не у MainWindow, а у glTest.
Записан
taifun
Гость
« Ответ #11 : Декабрь 23, 2009, 16:40 »

Да, переопределить keyPressedEvent() не у MainWindow, а у glTest.
а как это сделать  Непонимающий
Записан
Dendy
Гость
« Ответ #12 : Декабрь 23, 2009, 16:44 »

Убрать void keyPressEvent(QEvent*) в обьявлении MainwWindow и добавить в обьявлении glTest.
Записан
taifun
Гость
« Ответ #13 : Декабрь 23, 2009, 17:01 »

Убрать void keyPressEvent(QEvent*) в обьявлении MainwWindow и добавить в обьявлении glTest.

я закоментировал
Код:
void MainWindow::keyPressEvent( QKeyEvent *event )
{
    wgOpenGL->keyPressEvent(event);
}

и void keyPressEvent() в .h файле, а в glTest мне ничего не надо добавлять там и так все написано ......
после это перестало работать...
может я не так Вас понял?
Записан
Dendy
Гость
« Ответ #14 : Декабрь 23, 2009, 17:05 »

Понимаете, плохое знание C++ вместе с описаниями вроде "перестало работать" никак не способствуют чтобы вам помогли. Телепаты, увы, в отпуске.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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