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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QEvent для чайников:)  (Прочитано 4740 раз)
Olexandr
Гость
« : Февраль 20, 2013, 21:00 »

Есть программка которая выводит пустое OpenGL окно.
Причем цвет окна задается в glClearColor(0.5f,0.2f,0.5f,1.0f);
Меня очень интересует как считывать нажатые клавиши с клавиатуры. А конкретно вывод qDebug() << "hello world!";  при нажатии клавиши "0"
Я написал приблизительно код, а вот куда вставлять и как подключать... не разобрался еще. Помогите пожалуйста, кому не лень.


Код который нужно как то запустить:
Цитировать
Код:
if (event->type() == QEvent::KeyPress) {   // если событие - нажатие клавиши.
    if (event->key() == Qt::Key_0) {    // если нажатая клавиша = "0"
       qDebug() << "hello world!"; // высвисти "hello world!"
    }

    else {
      qDebug() <<"key =! Qt::Key_0";
    }
}
Любые ссылки приветствуються:)

и собственно программа которая создает пустое OpenGL  окно.
proekt.pro
Код:
QT       += core gui opengl

TARGET = proekt
TEMPLATE = app

SOURCES += \
    main.cpp \
    oknoGL.cpp

HEADERS += \
    oknoGL.h

main.cpp
Код:
#include "QApplication"
#include "oknoGL.h"

int main(int argc, char *argv[])
{
        QApplication app(argc, argv);
        oknoGL w;
        w.show();
        return app.exec();
}


oknoGL.h
Код:
#ifndef OKNOGL_H
#define OKNOGL_H
#include <QGLWidget>
#include <GL/glu.h>
#include <QtOpenGL>

class oknoGL : public QGLWidget
{
    Q_OBJECT
public:

 explicit oknoGL(QWidget *parent = 0);
 protected:
  void initializeGL();
  void resizeGL(int nWidth,int nHeight);
  void paintGL();

signals:
public slots:

};
#endif // OKNOGL_H

oknoGL.cpp
Код:
#include "oknoGL.h"

oknoGL::oknoGL(QWidget *parent) :
    QGLWidget(parent)
{}

void oknoGL::initializeGL(){
  glClearColor(0.5f,0.2f,0.5f,1.0f);
}
void oknoGL::resizeGL(int nWidth,int nHeight){
}

void oknoGL::paintGL(){
    glClear(GL_COLOR_BUFFER_BIT);
}
« Последнее редактирование: Февраль 20, 2013, 22:36 от Olexandr » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Февраль 20, 2013, 21:42 »

https://qt-project.org/doc/qt-4.8/qwidget.html#keyPressEvent

Сравнивай с Qt::Key_0, а не с числом. И даже сравнение с числом неправильное - нужно сравнивать с 0x30.
Записан
Olexandr
Гость
« Ответ #2 : Февраль 20, 2013, 22:35 »

https://qt-project.org/doc/qt-4.8/qwidget.html#keyPressEvent

Сравнивай с Qt::Key_0, а не с числом. И даже сравнение с числом неправильное - нужно сравнивать с 0x30.
Спасибо поправил.
Вот
if (event->type() == QEvent::KeyPress) {
    if (event->key() == Qt::Key_0) {   
       qDebug() << "hello world!";
    }
    else {
      qDebug() <<"key =! Key_0";
    }
}
теперь можно вставлять в main(){} ??

А как поступать дальше?
Пере означить класс keyPressEvent?
Код:
 void QWidget::keyPressEvent ( QKeyEvent * event ) 
я не совсем понял... Есть еще какие то материальчики, и желательно на русском?
Записан
k0p4
Гость
« Ответ #3 : Февраль 21, 2013, 18:56 »

Цитировать
Пере означить класс keyPressEvent?
Сперва выучите С++, потом Qt.
1. Не "пере означить" а "переопределить".
2. keyPressEvent - не класс, а метод.
3. Переопределить метод в классе oknoGL.
4. Личное пожелание. Не называйте переменные транслитом.
Записан
Olexandr
Гость
« Ответ #4 : Февраль 22, 2013, 17:45 »

Цитировать
Пере означить класс keyPressEvent?
Сперва выучите С++, потом Qt.
1. Не "пере означить" а "переопределить".
2. keyPressEvent - не класс, а метод.
3. Переопределить метод в классе oknoGL.
4. Личное пожелание. Не называйте переменные транслитом.

А что нельзя учись с++  и заодно паковаться с библиотеками Qt?
1-4, спасибо учту.

немного допилил код:)
(основу кода взято из - Шеле 4.5 с.266 )

Код:
void myMetod::keyPressEvent(QKeyEvent* pe)
{
    switch(pe->key())
    {
        case Qt::Key_0:              // если нажатая клавиша = "0"       
        qDebug() << "hello world!"; // высвисти "hello world!"
    }
   
    else {
        qDebug() <<"key =! Qt::Key_0";
         }
    default:
        QWidget::keyPressEvent(pe); // Передать событие дальше
}
 

при этом myMetod должен быть объектом-потомком Qwidget, например:
наследник класса, допустим "oknoGL" который, как я понимаю с нижнего кода, наследует вот так:
Qwidget->QGLWidget->oknoGL
тесть, унаследовав такой класс обработка нажатий будет работать?

Код:
class oknoGL : public QGLWidget
{
    Q_OBJECT
public:
 explicit oknoGL(QWidget *parent = 0);
 protected:
  void initializeGL();
  void resizeGL(int nWidth,int nHeight);
  void paintGL();
 
signals:
public slots:
};
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Февраль 22, 2013, 17:53 »

А что нельзя учись с++  и заодно паковаться с библиотеками Qt?

категорически не советую, ибо уровень непонимания будет высокий. Виртуальные методы - один из столпов C++, и он уже вызывает непонимание у тебя.
Записан
Olexandr
Гость
« Ответ #6 : Февраль 22, 2013, 18:18 »

категорически не советую, ибо уровень непонимания будет высокий. Виртуальные методы - один из столпов C++, и он уже вызывает непонимание у тебя.
Я так просто не сдаюсь, если не будет прогресса  в понимании то тогда уже возьмусь отдельно за с++
В университете учил С++ но ни разу не слышал про "Виртуальные методы", буду поправлять))
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Февраль 22, 2013, 23:02 »

А где так учат, если не секрет?Улыбающийся
Записан
k0p4
Гость
« Ответ #8 : Февраль 25, 2013, 16:41 »

Цитировать
А что нельзя учись с++  и заодно паковаться с библиотеками Qt?
Я начинал как Вы. Только пришлось выучить С++ и только потом взятся за Qt. Пожалейте своё время.

Обьясните, пожалуйста, что должен делать метод
Цитировать
void myMetod::keyPressEvent(QKeyEvent* pe)
{
    switch(pe->key())
    {
        case Qt::Key_0:              // если нажатая клавиша = "0"       
        qDebug() << "hello world!"; // высвисти "hello world!"
    }
   
    else {
        qDebug() <<"key =! Qt::Key_0";
         }
    default:
        QWidget::keyPressEvent(pe); // Передать событие дальше
}
Этот код даже не сбилдится.



Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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