Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: OpGL воздействие на объект сигналами, слотов
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
__ilya__
Ни как не врублюсь в сигналы и слоты. По этой причине 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
Если нужно по нажатию клавишь сделать действие, то сигналы и слоты тут не причем. У всех виджетов есть набор виртуальных методов-ивентов с помощью которых можно сделать большинство обновляемых событий.
В твоем случае это

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();
}
__ilya__
спасибо.
скажите еще
Цитата
(я смотрю ты ogl отдельно юзаешь, хотя в Qt он встроеный)

setXRotation(xRot + 8 * dy);
setYRotation(yRot + 8 * dx);
это базовые методы QT, или пользовательские?
и еще два вопроса:
как это с помощью оконных кнопок сделать?
как эти параметры с клавиатуры задавать? я имею в виду вводить числа, соответствующие углам поворота и трансляции.
sidsukana
Цитата(__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__
понятней стало.
оконные кнопки прямо поверх,OGl изображения будут?
Рюк
и не надейся! тебе нужно графическое представление, и малевать ГЛ сцену в бекграунде.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.