C++ Qt 5.3。用OpenGL直接绘制QWidget
你好。 是否有任何方法可以在没有C++ Qt 5.3。用OpenGL直接绘制QWidget,c++,qt,opengl,C++,Qt,Opengl,你好。 是否有任何方法可以在没有QPainter的情况下绘制基于QWidget的窗口。我尝试使用原始OpenGL绘制以下代码: 1) 主要功能: int main(int argc, char* argv[]) { QApplication app(argc, argv); GLWindow* window = new GLWindow; window->setMinimumSize(200, 200); window->initializeGLCon
QPainter
的情况下绘制基于QWidget
的窗口。我尝试使用原始OpenGL绘制以下代码:
1) 主要功能:
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
GLWindow* window = new GLWindow;
window->setMinimumSize(200, 200);
window->initializeGLContext();
window->show();
return app.exec();
}
GLWindow从QMainWindow
中导入。我使用glew库来处理OpenGL
。下面是代码的简化版本,没有错误处理和愚蠢的程序流
namespace {
GLfloat vertices[] = {
0.0f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f
};
const char* vertexShaderSource =
"in vec2 position;"
"void main() {"
"gl_Position = vec4(position, 0.0, 1.0); }";
const char* fragmentShaderSource =
"out vec4 outColor;"
"void main() {"
"outColor = vec4(1.0, 0.0, 0.0, 1.0); }";
}
GLWindow::GLWindow() {
setAttribute(Qt::WA_PaintOnScreen, true); }
void GLWindow::initializeGLContext() {
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
24, 8, 0,
PFD_MAIN_PLANE, 0, 0, 0, 0 };
HDC hdc = GetDC((HWND)winId());
int windowPixelFormat = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, windowPixelFormat, &pfd);
HGLRC hglrc = wglCreateContext(hdc);
wglMakeCurrent(hdc, hglrc);
}
QPaintEngine* GLWindow::paintEngine() const { return 0; }
void GLWindow::paintEvent(QPaintEvent *) {
glewInit();
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glEnableVertexAttribArray(posAttrib);
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
SwapBuffers(GetDC((HWND)winId()));
}
在程序执行之后,我所拥有的就是没有三角形的黑屏。我是Qt
方面的新手,如果您有任何问题的建议,请与我分享
致以最诚挚的问候。您应该使用和替代
paintGL
。根据Qt文档使用QGLWidget
。如果您需要自定义openGL,或者根本不用它。出于某些原因,我不想使用Qt内置的openGL支持。还有其他选择吗?