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; }
Это нажатие на кнопку
При этом комбобокс и кнопка всё ещё остаются кликабельными, хоть их и не видно.
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 11, 2024, 11:58 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 25, 2024, 10:37 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 25, 2024, 10:29 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
Я не уверен, поскольку с OpenGL очень мало работал. Но может быть OpenGL контекст виджета нужно переинициализовывать.
И ещё виджет стоит удалять через метод deleteLater() а не прямым вызовом оператора delete .
Это особенность работы Qt, все объекты, которые наследованы от QObject имеют метод deleteLater, который обеспечивает безопасное удаление объектов в Qt.
Поскольку Qt может у себя внутри использовать указатели на данные объекты на момент вызова оператора delete.