Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/78: Рейтинг темы: голосов - 78, средняя оценка - 4.82
 Аватар для AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533

Qt + OpenGL

01.02.2012, 14:33. Показов 16160. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собсно, странная, я бы даже сказал

Подключив
C++
1
#include <GL/glu.h>
(наверное зря, ибо всё должно быть в #include <QtOpenGL>
получаем совсем непонятные (мне) вещи.

Весь код взят из книги Бланшета и Саммерфилда "Qt 4 | Программирование GUI на C++", раздел OpenGL (страница 478).
<***>.pro
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#-------------------------------------------------
#
# Project created by QtCreator 2012-02-01T14:17:00
#
#-------------------------------------------------
 
QT       += core gui opengl
 
TARGET = <***>
TEMPLATE = app
 
 
SOURCES += main.cpp
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <QtGui/QApplication>
#include "window.h"
#include <QtOpenGL>
//#include <GL/glu.h>
#include <iostream>
 
class Tetrahedron : public QGLWidget
{
    Q_OBJECT
public:
    Tetrahedron(QWidget *parent = 0);
    protected:
    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);
    private:
    void draw();
    int faceAtPosition(const QPoint &pos);
    GLfloat rotationX;
    GLfloat rotationY;
    GLfloat rotationZ;
    QColor faceColors[4];
    QPoint lastPos;
};
 
Tetrahedron::Tetrahedron(QWidget *parent):QGLWidget(parent)
{
    setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer));
    rotationX = -21.0;
    rotationY = -57.0;
    rotationZ = 0.0;
    faceColors[0] = Qt::red;
    faceColors[1] = Qt::green;
    faceColors[2] = Qt::blue;
    faceColors[3] = Qt::yellow;
}
 
void Tetrahedron::initializeGL()
{
    qglClearColor(Qt::black);
    glShadeModel(GL_FLAT);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
}
 
void Tetrahedron::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLfloat x = GLfloat(width) / height;
    glFrustum(-x, x, -1.0, 1.0, 4.0, 15.0);
    glMatrixMode(GL_MODELVIEW);
}
 
void Tetrahedron::draw()
{
    static const GLfloat P1[3] = { 0.0, -1.0, +2.0 };
    static const GLfloat P2[3] = { +1.73205081, -1.0, -1.0 };
    static const GLfloat P3[3] = { -1.73205081, -1.0, -1.0 };
    static const GLfloat P4[3] = { 0.0, +2.0, 0.0 };
    static const GLfloat * const coords[4][3] = {
        { P1, P2, P3 },
        { P1, P3, P4 },
        { P1, P4, P2 },
        { P2, P4, P3 }
    };
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -10.0);
    glRotatef(rotationX, 1.0, 0.0, 0.0);
    glRotatef(rotationY, 0.0, 1.0, 0.0);
    glRotatef(rotationZ, 0.0, 0.0, 1.0);
    for (int i = 0; i < 4; ++i) {
        glLoadName(i);
        glBegin(GL_TRIANGLES);
        qglColor(faceColors[i]);
        for (int j = 0; j < 3; ++j) {
            glVertex3f(coords[i][j][0], coords[i][j][1],
            coords[i][j][2]);
        }
        glEnd();
    }
}
 
void Tetrahedron::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    draw();
}
 
void Tetrahedron::mousePressEvent(QMouseEvent *event)
{
    lastPos = event->pos();
}
 
void Tetrahedron::mouseMoveEvent(QMouseEvent *event)
{
    GLfloat dx = GLfloat(event->x() - lastPos.x()) / width();
    GLfloat dy = GLfloat(event->y() - lastPos.y()) / height();
    if (event->buttons() & Qt::LeftButton) {
        rotationX += 180 * dy;
        rotationY += 180 * dx;
        updateGL();
    }else if(event->buttons() & Qt::RightButton){
        rotationX += 180 * dy;
        rotationZ += 180 * dx;
        updateGL();
    }
    lastPos = event->pos();
}
 
void Tetrahedron::mouseDoubleClickEvent(QMouseEvent *event)
{
    int face = faceAtPosition(event->pos());
    if (face != -1) {
        QColor color = QColorDialog::getColor(faceColors[face], this);
        if (color. isValid()) {
            faceColors[face] = color;
            updateGL();
        }
    }
}
 
int Tetrahedron::faceAtPosition(const QPoint &pos)
{
    const int MaxSize = 512;
    GLuint buffer[MaxSize];
    GLint viewport[4];
 
    glGetIntegerv(GL_VIEWPORT, viewport);
    glSelectBuffer(MaxSize, buffer);
    glRenderMode(GL_SELECT);
 
    glInitNames();
    glPushName(0);
 
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    /*GLdouble _x = pos.x(),
            _y = viewport[3] - pos.y(),
            _width = 5.0,
            _height = 5.0;
    GLint *v = viewport;
    gluPickMatrix(_x, _y, _width, _height, v);
    */gluPickMatrix(GLdouble(pos.x()),
                  GLdouble(viewport[3] - pos.y()),
                  5.0,
                  5.0,
                  viewport);
    GLfloat x = GLfloat(width()) / height();
    glFrustum(-x, x, -1.0, 1.0, 4.0, 15.0);
    draw();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
 
    if (!glRenderMode(GL_RENDER))
        return -1;
    return buffer[3];
}
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    if (!QGLFormat::hasOpenGL()) {
        std::cerr << "This system has no OpenGL support" << std::endl;
        return 1;
    }
    Tetrahedron tetrahedron;
    tetrahedron.setWindowTitle(QObject::tr("Tetrahedron"));
    tetrahedron.resize(300, 300);
    tetrahedron.show();
 
    return app.exec();
}

По сабжу - что за фигня?!. Собрать-то надо...
Заранее спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.02.2012, 14:33
Ответы с готовыми решениями:

Какая значительная разница между OpenGL ES 2.0 и OpenGL 3.3 при использовании в Qt
Привет всем! У меня видеокарта имеет поддержку 3.1 версию OpenGL, обновить хочу её с помощью установщика драйвера. У меня такой вопрос:...

Чем отличаются готовые сборки Qt под Win + MSVC с OpenGL и без OpenGL?
Ну вопрос собственно в том, что мне не очень понятно, что же в сборке кьюте без опен джел имеется вместо него? Тоесть понятно, что в сборке...

Qt+OpenGL. Qt "не видит" функции OpenGL
Доброго времени суток. Срочно нужна помощь. Скопировал код со статьи http://www.gamedev.ru/code/articles/OpenGL_Qt4 (своего не...

28
 Аватар для AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
10.02.2012, 11:58  [ТС]
Студворк — интернет-сервис помощи студентам
Я тоже думаю, что с Qt креатором подтянется и SDK =)
Впрочем, вот этого не достаточно?
0
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
10.02.2012, 12:07
я думаю что он может подтянуть только свои зависимости, например у меня на SUSE при установке только QtCreatora не все было доступно пока не до устанавливал devel пакеты
0
 Аватар для AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
10.02.2012, 13:54  [ТС]
Сейчас качаю SDK...

OHhhh, NO!!! 700 МЕТРОВ!!! У меня в руте осталось полтора гига!!! OHhhh, NO!!!
0
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
10.02.2012, 14:40
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Сейчас качаю SDK...

OHhhh, NO!!! 700 МЕТРОВ!!! У меня в руте осталось полтора гига!!! OHhhh, NO!!!
поставить можно в хомяк при установке все прапишиться и все будет нормально работать я ставлю обычно в opt
0
 Аватар для AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
10.02.2012, 16:21  [ТС]
Впрочем, я тут подумал... Я ведь не юзал раньше Qt, попробовал посозидать что-нибудь попроще... И самое интересное - всё работает =/
screen
0
27 / 27 / 13
Регистрация: 07.11.2010
Сообщений: 154
06.06.2013, 21:04
Такая же хрень. Что только не подключал. На одном компе работает на другом нет... И решения, как я понял в этой теме неТ?

Подключены все хедеры, а все равно ругается:
..\OpenGLExamlpe\myopenglscene.cpp: In member function 'virtual void myOpenGLScene::initializeGL()':
..\OpenGLExamlpe\myopenglscene.cpp:10:17 : error: 'GL_FLAT' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:10:24 : error: 'glShadeModel' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:13:24 : error: 'GL_VERTEX_ARRAY' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:13:39 : error: 'glEnableClientState' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:14:24 : error: 'GL_COLOR_ARRAY' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp: In member function 'virtual void myOpenGLScene::resizeGL(int, int)':
..\OpenGLExamlpe\myopenglscene.cpp:19:17 : error: 'GL_PROJECTION' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:19:30 : error: 'glMatrixMode' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:20:19 : error: 'glLoadIdentity' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:25:59 : error: 'glOrtho' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:27:59 : error: 'glOrtho' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp: In member function 'virtual void myOpenGLScene:aintGL()':
..\OpenGLExamlpe\myopenglscene.cpp:36:17 : error: 'GL_MODELVIEW' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:36:29 : error: 'glMatrixMode' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:37:19 : error: 'glLoadIdentity' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp: In member function 'void myOpenGLScene::drawAxis()':
..\OpenGLExamlpe\myopenglscene.cpp:45:39 : error: 'glColor4f' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:46:20 : error: 'glBegin' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:47:37 : error: 'glVertex3f' was not declared in this scope
..\OpenGLExamlpe\myopenglscene.cpp:49:10 : error: 'glEnd' was not declared in this scope
0
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
06.06.2013, 22:54
в pro файл opengl прописали? Библиотеки все стоят?
0
27 / 27 / 13
Регистрация: 07.11.2010
Сообщений: 154
07.06.2013, 09:12
Написал! Библиотеки есть. Ну точнее я физически наблюдаю все хедеры в папке с Qt : Qt5.0.2\5.0.2\mingw47_32\include\QtOpenG L

Я вот тут подумал, на сайте QT для скачки доступны разные версии, в том числе Qt 5.0.2 for Windows 32-bit (VS 2010, OpenGL, 476 MB) - под MSVS компилятор. И вот это дополнение в скобках OpenGL... Получается, что только там есть сами библиотеки OpenGL, а не только их хедеры? Или к чему это замечание?
0
27 / 27 / 13
Регистрация: 07.11.2010
Сообщений: 154
08.06.2013, 11:11
В общем никакие танцы не помогли.

Скачал QtSDK отсюда http://www.qtcentre.org/QtSdk-... v1_2_1.exe - это он-лайн инсталлер. Удалил старые все версии QT, поставил скаченную и все окей.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.06.2013, 11:11

Perl + OpenGL Как избавиться от повторного подключения библиотеки OpenGL в модулях
Доброго времени суток! Сегодня решил заняться программированием на языке Perl, используя библиотеку OpenGL :D Возникли вопросы: ...

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо инициализация происходить по другому. как мне...

OpenGL Ваша текущая конфигурация рабочего стола не поддерживает OpenGL Аппаратное ускорение.
всем здрасте ) скачал opengl extensions viewer решил проверить драйверы на видео карту.В разделе программы Repot мне посыпалось куча...

(2 главы перевода книги доступно) OpenGL Programming Guide, Version 4.3, 8th Edition - OpenGL
Продолжая тему с переводом книги https://www.cyberforum.ru/opengl/thread1551398.html Выкладываю для скачивания вторую переведенную главу...

Ошибки при подключение opengl, немного не связанные с opengl
#include &lt;windows.h&gt; #include &quot;stdafx.h&quot; #include &lt;gl/gl.h&gt; #include &lt;gl/glu.h&gt; #include &lt;stdio.h&gt; //#include &quot;TXLib.h&quot; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru