crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> OpGL воздействие на объект сигналами, слотов
__ilya__
  опции профиля:
сообщение 2.4.2012, 12:32
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 19.1.2012
Пользователь №: 3143

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ни как не врублюсь в сигналы и слоты. По этой причине OpenGL в месте с SDL использую, а мне хотелось с Qt

простой пример
float xt = 0, yt = 0, zt = 0;
int main( int argc, char** argv )
{
// тут иницилизация окна, опен жл и тому подобное
while(1)
{
//
//нажатие клавиш
if (keys[SDLK_LEFT])
                yr += 1.0f;
            if (keys[SDLK_RIGHT])
                yr -= 1.0f;
            if (keys[SDLK_UP])
                zt += 1.0;
            if (keys[SDLK_DOWN])
                zt -= 1.0f;
}

//
//
glTranslatef(xt, yt, zt);//транслируем
// тут рисуется, например триугольник
}


во куски кода на SDL. я нажимаю на стрелки и объект транслируется. А как на Qt сделать?
В летиратуре про сигналы и слоты, слишком мало сказано, я считаю. Может этот пример внесет дополнительную ястность.



Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 2.4.2012, 13:49
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


Если нужно по нажатию клавишь сделать действие, то сигналы и слоты тут не причем. У всех виджетов есть набор виртуальных методов-ивентов с помощью которых можно сделать большинство обновляемых событий.
В твоем случае это

virtual void keyPressEvent ( QKeyEvent * event )


Однако для этого нужно наследоваться с QWidget, а точней с QGLWidget (я смотрю ты ogl отдельно юзаешь, хотя в Qt он встроеный)

Допустим у меня вращение объекта в графическом виджете вот так реализовано.

// цепляем по нажатию кнопки мыши
void GLWidget::mousePressEvent(QMouseEvent *event)
{
    lastPos = event->pos();
}

// вращаем
void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
    int dx = event->x() - lastPos.x();
    int dy = event->y() - lastPos.y();

    if (event->buttons() & Qt::LeftButton)
    {
        setXRotation(xRot + 8 * dy);
        setYRotation(yRot + 8 * dx);
    }
    else if (event->buttons() & Qt::RightButton)
    {
        setXRotation(xRot + 8 * dy);
        setZRotation(zRot + 8 * dx);
    }
    lastPos = event->pos();
}

// приближаем и отдаляем колесиком
void GLWidget::wheelEvent(QWheelEvent *event)
{
     int numDegrees = event->delta() / 8;

     numDegrees > 0 ? zoom += 0.5 : zoom -= 0.5;

     updateGL();
     event->accept();
}


Сообщение отредактировал sidsukana - 2.4.2012, 13:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
__ilya__
  опции профиля:
сообщение 3.4.2012, 9:42
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 19.1.2012
Пользователь №: 3143

Спасибо сказали: 0 раз(а)




Репутация:   0  


спасибо.
скажите еще
Цитата
(я смотрю ты ogl отдельно юзаешь, хотя в Qt он встроеный)

setXRotation(xRot + 8 * dy);
setYRotation(yRot + 8 * dx);
это базовые методы QT, или пользовательские?
и еще два вопроса:
как это с помощью оконных кнопок сделать?
как эти параметры с клавиатуры задавать? я имею в виду вводить числа, соответствующие углам поворота и трансляции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 3.4.2012, 11:36
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


Цитата(__ilya__ @ 3.4.2012, 11:42) *
спасибо.
скажите еще
Цитата
(я смотрю ты ogl отдельно юзаешь, хотя в Qt он встроеный)

setXRotation(xRot + 8 * dy);
setYRotation(yRot + 8 * dx);
это базовые методы QT, или пользовательские?
и еще два вопроса:
как это с помощью оконных кнопок сделать?
как эти параметры с клавиатуры задавать? я имею в виду вводить числа, соответствующие углам поворота и трансляции.


Функции ротации взяты из примера, они являются сигнализаторами изменения ротации объекта для ogl виджета

void GLWidget::setXRotation(int angle)
{
    qNormalizeAngle(angle);
    if (angle != xRot)
    {
        xRot = angle;
        emit xRotationChanged(angle);
        updateGL();
    }
}


С помощью кнопок тоже просто - вызывать эти функции из слота который соединяется с кнопкой вот так
// после объявления виджета и кнопки (ну обычно в конструкторе мейн виджета делается)
connect(button, SIGNAL(clicked()), widget, SLOT(slotSetXRotation()));

// ну и наш слот
void GLWidget::slotSetXRotation()
{
    setXRotation(angle);
}


Где angle можно будет вычислить из последних+настроечных данных

Допустим xRot вы указываете в настройках, тогда параметром передаете значения той настройки (это может быть скрытое текстовое поле или QSettings или еще что)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
__ilya__
  опции профиля:
сообщение 3.4.2012, 11:49
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 19.1.2012
Пользователь №: 3143

Спасибо сказали: 0 раз(а)




Репутация:   0  


понятней стало.
оконные кнопки прямо поверх,OGl изображения будут?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Рюк
  опции профиля:
сообщение 15.8.2012, 21:43
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 14.8.2012
Пользователь №: 3484

Спасибо сказали: 0 раз(а)




Репутация:   0  


и не надейся! тебе нужно графическое представление, и малевать ГЛ сцену в бекграунде.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.4.2024, 14:50