Доброго дня!
Использую qt-5.5.1 x86, для быстрого отображения изображения создал дочерний класс от QOpenGLWidget и определил в нём функции initializeGL, painGL и resizeGL.
В главное окно приложения добавил QWidget и перевёл его в мой класс наследующий от QOpenGLWidget.
В принципе изображение выводится, но оно выводится не в виджете, а поверх всего приложения, выглядит это как постоянное переключение между отображением изображения и окна приложения.
Вопрос - как заставить выводить изображение в QOpenGLWidget, а не поверх всего приложения.
Спасибо.
[РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Модератор: Модераторы разделов
-
- Сообщения: 2566
- ОС: Debian
-
- Сообщения: 2041
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Тут будет тяжело сказать что-то конкретное пока не увидим код.
Labor omnia vincit
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
-
- Сообщения: 2566
- ОС: Debian
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Код: Выделить всё
GLWidget::GLWidget(QWidget *parent) :
QOpenGLWidget(parent)
{}
GLWidget::~GLWidget()
{
glDeleteTextures(CHANNEL_MAX, _texture);
}
void GLWidget::add(QImage image, quint8 pos)
{
if (pos < CHANNEL_MAX) {
qDebug() << func << "add position" << pos;
glActiveTexture(GL_TEXTURE0 + pos);
glBindTexture(GL_TEXTURE_2D, _texture[pos]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.constBits());
update();
}
}
void GLWidget::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0, 0, 0, 1);
glEnable(GL_TEXTURE_2D);
glGenTextures(CHANNEL_MAX, _texture);
}
void GLWidget::paintGL()
{
qDebug() << func;
glDrawArrays(GL_TEXTURE_2D_ARRAY, _texture[0], CHANNEL_MAX);
}
void GLWidget::resizeGL(int w, int h)
{}
-
- Сообщения: 1139
- ОС: Fedora
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Тут как раз всё понятно. Интереснее как вы его используете. Не забыли ли отдать под управление какого либо layout - без этого любой виджет будет выводить куда попало.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
А что не так, вроде работает.
Ну, не считая странного вызова glDrawArrays.
PS
Или получаете чёрное окно и сообщения в логах (libGL error)? NVidia? Тогда нужно убрать переменную GL_LIBRARY_PATH из конфига QtCreator (Projects → Build&Run → Run).
Ну, не считая странного вызова glDrawArrays.
PS
Или получаете чёрное окно и сообщения в логах (libGL error)? NVidia? Тогда нужно убрать переменную GL_LIBRARY_PATH из конфига QtCreator (Projects → Build&Run → Run).
-
- Сообщения: 2566
- ОС: Debian
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
widget расположен на mainwindow, собственно он там единственный, на всё mainwindows применяется горизонтальное выравнивание
Работает, но выводит поверх mainwindow, а не в самом виджете
Почему странного? Мне нужно следующее - вывести несколько изображений друг за другом расположив их в одну линию, этакая панорама.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
IMB
Ну, наверное с glDrawArrays Вы что-то не скопировали, потому что glDrawArrays не работает непосредственно с текстурами, но массивами, а у Вас не приведён код, который бы устанавливал такие массивы.
Ну, а в остальном, код нормально работает. Вывел какую-то ересь как текстуру в обычный quad:
Ну, наверное с glDrawArrays Вы что-то не скопировали, потому что glDrawArrays не работает непосредственно с текстурами, но массивами, а у Вас не приведён код, который бы устанавливал такие массивы.
Ну, а в остальном, код нормально работает. Вывел какую-то ересь как текстуру в обычный quad:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Сообщения: 2566
- ОС: Debian
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Я не совсем Вас понимаю.
Текстуры я храную в массиве _texture, заполняю его в функции GLWidget::add(QImage image, quint8 pos).
Не затруднит ли Вас привести пример кода для вывода текстур из массива?
P.S. Может быть Вы прикрепите архив с кодом Вашей тестовой программы?
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Вот.
Вариант с использованием нескольких текстур для glDrawArrays не лучший вариант. В случае одной текстуры можно было б одним вызовом всё нарисовать.
Вариант с использованием нескольких текстур для glDrawArrays не лучший вариант. В случае одной текстуры можно было б одним вызовом всё нарисовать.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
-
- Сообщения: 2566
- ОС: Debian
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Не затруднит ли разъяснить некоторые моменты:
- txcoords, насколько я понимаю, это координаты четырёх углов текстуры, vertecies также похоже на координаты, но зачем они нужны?
- везде используется число 4, насколько я понимаю это связано с тем, что используется 2D текстура с четырьма углами, но почему при генерации координат везде используется множитель 2?
- полоса для вывода имеет белый цвет, хотя в initializeGL() выставлено использовать чёрный (glClearColor(0, 0, 0, 1)), как можно регулировать её цвет
Спасибо.
- txcoords, насколько я понимаю, это координаты четырёх углов текстуры, vertecies также похоже на координаты, но зачем они нужны?
- везде используется число 4, насколько я понимаю это связано с тем, что используется 2D текстура с четырьма углами, но почему при генерации координат везде используется множитель 2?
- полоса для вывода имеет белый цвет, хотя в initializeGL() выставлено использовать чёрный (glClearColor(0, 0, 0, 1)), как можно регулировать её цвет
Спасибо.
-
- Сообщения: 858
- Статус: Оператор вычислительных машин
- ОС: Debian
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
txcoords - это координаты на самой текстуре, а vertecies - вершины многоугольника в пространстве.
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Опыт - это когда все получается с первого раза.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
1. Да, txcoords — это координаты текстур для соответствующих вершин. vertecies — это координаты вершин в мире (сцене). Ну, чтобы что-то нарисовать, надо сообщить, где его рисовать, вот это и задаётся в данном массиве.
2.
4 — да, потому что используются 4-угольники.
2 — количество измерений на вершину (x,y для вершин, s,t — для текстур)
3. glClearColor задаёт цвет очистки буфера. Для вершин цвет задаётся отдельно. Ну, и данный цвет микшируется с цветом текстуры, поэтому, если задать просто чёрный цвет для всех вершин, то чёрным будет всё.
2.
4 — да, потому что используются 4-угольники.
2 — количество измерений на вершину (x,y для вершин, s,t — для текстур)
3. glClearColor задаёт цвет очистки буфера. Для вершин цвет задаётся отдельно. Ну, и данный цвет микшируется с цветом текстуры, поэтому, если задать просто чёрный цвет для всех вершин, то чёрным будет всё.