Qt + OpenGL glDeleteVertexArrays
Использую QMainWindow, внутри QGridLayout с табвиджетом, кнопкой и комбобоксом. В табвиджете один единственный QOpenGLWidget(OpenGL 4.3 core). Хочу менять QOpenGLWidget на другой(с удалением старого) по нажатию кнопки. Меняются 2 картинки - точка в середине экрана, и просто фон красного цвета. Так вот, когда я меняю первый виджет на второй, то без использования glDeleteVertexArrays всё работает нормально, а вот при использовании функции всё окно становится просто чёрным, включая кнопку и комбобокс.
f->glGenVertexArrays(1, &vertexArrayObject); f->glBindVertexArray(vertexArrayObject);
InitializeGL().
static const GLfloat red[] = { 1.0f, 0.0f, 0.0f, 1.0f }; f->glClearBufferfv(GL_COLOR, 0, red); f->glUseProgram(program); f->glPointSize(40.0f); f->glDrawArrays(GL_POINTS, 0, 1);
PaintGL().
f->glDeleteVertexArrays(1, &vertexArrayObject); f->glDeleteProgram(program);
Деструктор
if (ui->cbSwitchListing->currentText() == "Figure 2.1") { QWidget *widget = ui->twShower->currentWidget(); if (widget->objectName() != "figure_2_1") { ui->twShower->removeTab(0); delete widget; Figure_2_1 *figure_2_1 = new Figure_2_1; figure_2_1->setObjectName("figure_2_1"); ui->twShower->addTab(figure_2_1, "Figure 2.1"); } return; }
Это нажатие на кнопку
При этом комбобокс и кнопка всё ещё остаются кликабельными, хоть их и не видно.
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Я не уверен, поскольку с OpenGL очень мало работал. Но может быть OpenGL контекст виджета нужно переинициализовывать.
И ещё виджет стоит удалять через метод deleteLater() а не прямым вызовом оператора delete .
Это особенность работы Qt, все объекты, которые наследованы от QObject имеют метод deleteLater, который обеспечивает безопасное удаление объектов в Qt.
Поскольку Qt может у себя внутри использовать указатели на данные объекты на момент вызова оператора delete.