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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]QGraphicsView, QGraphicsItem, OpenGL  (Прочитано 6969 раз)
klou
Гость
« : Декабрь 23, 2010, 14:31 »

В QGraphicsView::drawBackground() (QGraphicsView унаследован) содержится код прорисовки фона с использованием OpenGL.
Фон отображается, однако не рисуются добавленные в сцену QGraphicsItem.
При замене вьюпорта (setViewport()) на QWidget вместо QGLWidget, QGraphicsItem рисуются нормально (но, естественно, нет фона).

В "тепличных" условиях (отдельный проект VS для проверки именного этого явления) объекты нормально рисуются на фоне отрисованном OpenGL.

У кого-нибудь был подобный опыт? Или может есть идеи?
« Последнее редактирование: Январь 12, 2011, 08:32 от klou » Записан
klou
Гость
« Ответ #1 : Январь 11, 2011, 12:37 »

После новогодних праздников обнаружил:
Код:
void QMyGraphicsView::drawBackground( QPainter * painter, const QRectF & rect )
{
 /* этот код рисует */
 glColor3f(0.6,0.4,0.0);
 glBegin(GL_TRIANGLES);
  glVertex2f(-0.5, -0.5);
  glVertex2f( 0.5, -0.5);
  glVertex2f( 0.0,  0.5);
 glEnd();
/* а этот - нет )*/
 painter->fillRect(rect,QBrush(QColor(Qt::yellow)));
}
а если сделать вот так:
Код:
void QMyGraphicsView::drawBackground( QPainter * painter, const QRectF & rect )
{
 painter->fillRect(rect,QBrush(QColor(Qt::yellow)));

 glColor3f(0.6,0.4,0.0);
 glBegin(GL_TRIANGLES);
  glVertex2f(-0.5, -0.5);
  glVertex2f( 0.5, -0.5);
  glVertex2f( 0.0,  0.5);
 glEnd();
}
то вообще ничего не рисуется
Записан
alexman
Гость
« Ответ #2 : Январь 11, 2011, 12:40 »

Попробуй обернуть нативные вызовы методами:
Код:
void QPainter::beginNativePainting ()
void QPainter::endNativePainting ()
Записан
klou
Гость
« Ответ #3 : Январь 11, 2011, 13:24 »

Код:
void QMyGraphicsView::drawBackground( QPainter * painter, const QRectF & rect )
{
GLuint glErr = glGetError();
char* gluErrStr = (char*)gluErrorString(glErr);

painter->beginNativePainting();
glColor3f(0.6,0.4,0.0);
glBegin(GL_TRIANGLES);
glVertex2f(-0.5, -0.5);
glVertex2f( 0.5, -0.5);
glVertex2f( 0.0,  0.5);
glEnd();
painter->endNativePainting();

painter->fillRect(rect,QBrush(QColor(Qt::yellow)));
}
Без изменений.
glGetError() показал ошибку "недопустимое значение". Возможно на выводе изображения сказывается где-то ранее произошедшая ошибка.
Записан
klou
Гость
« Ответ #4 : Январь 11, 2011, 13:36 »

Наврал про "без изменений" - теперь и треугольник не рисуется  Смеющийся
Записан
klou
Гость
« Ответ #5 : Январь 11, 2011, 13:44 »

"Сбросил" матрицы:
Код:
	glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glColor3f(0.6,0.4,0.0);
glBegin(GL_TRIANGLES);
glVertex2f(-0.5, -0.5);
glVertex2f( 0.5, -0.5);
glVertex2f( 0.0,  0.5);
glEnd();
теперь треугольник рисуется.
Записан
twp
Гость
« Ответ #6 : Январь 11, 2011, 13:58 »

я так понимаю что
Код:
painter->fillRect(rect,QBrush(QColor(Qt::yellow)));

заполняет фон, а потом рисуюется треугольник.
тогда в такой же последовательности нужно делать вызова как в примере

http://doc.qt.nokia.com/latest/qpainter.html#beginNativePainting
Записан
klou
Гость
« Ответ #7 : Январь 11, 2011, 14:57 »

Я "внутри" поковырялся немного.
"Фон" рисуется посредством glDrawArrays - выводятся два треугольника (GL_TRIANGLES_STRIP), которые покрывают клиентскую часть окна - получается "типа фон".
Мне на данный момент не принципиально, если "фон" покроет треугольник. На данный момент нужно разобраться, почему painter не рисует.
Записан
klou
Гость
« Ответ #8 : Январь 12, 2011, 08:31 »

Выяснил в чём была загвоздка. На самом деле QPainter рисовал, но предварительно (в конструкторе QMyGraphicsView) было включено отсечение невидимых граней:
Код:
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
Получается отсечение геометрии, обход которой происходит по часовой стрелке. А QPainter, как выяснилось, рисует геометрию (всю ли?) по часовой. Т.о. геометрия QPainter-a отсекалась OpenGL.
+1 в копилку опыта Улыбающийся

p.s. Item-ы тоже стали отображаться.
« Последнее редактирование: Январь 12, 2011, 08:33 от klou » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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