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 хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
- Ora Iro
- Жел. 24, 2024, 6:38 Т.Ж.
C++ - Тест 001. Первая программа и типы данных
- Нәтиже:40ұпай,
- Бағалау ұпайлары-8
- Akiv Doros
- Қар. 11, 2024, 2:58 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
- molni99
- Қаз. 26, 2024, 1:37 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
Я не уверен, поскольку с OpenGL очень мало работал. Но может быть OpenGL контекст виджета нужно переинициализовывать.
И ещё виджет стоит удалять через метод deleteLater() а не прямым вызовом оператора delete .
Это особенность работы Qt, все объекты, которые наследованы от QObject имеют метод deleteLater, который обеспечивает безопасное удаление объектов в Qt.
Поскольку Qt может у себя внутри использовать указатели на данные объекты на момент вызова оператора delete.