QDockWidget 中小部件的错误 OpenGL 视口
Wrong OpenGL viewport of widget inside QDockWidget
我正在 QDockWidget 内的小部件上绘制东西,并且具有 1:1 平方纵横比。但是,未正确调整绘图表面的大小。
它应该如何工作:
工作原理:
代码只在角(坐标)处绘制了 4 个点,在中间绘制了另一个点
const float vertices[] = {
0.0f, 0.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
};
resizeEvent(保持 1:1 纵横比):
void Renderer::resizeEvent(QResizeEvent *event){
if (this->width() > this->height()){
this->resize(this->height(), this->height());
} else {
this->resize(this->width(), this->width());
}
}
我制作了一个 python MRE,效果很好:
from OpenGL.GL import (glClear, GL_COLOR_BUFFER_BIT, glEnable, glClearColor, GL_DEPTH_BUFFER_BIT, glBegin, glColor, glVertex, glEnd,
glPointSize, GL_POINT_SMOOTH, GL_POINTS)
from PyQt5.QtCore import QSize
from PyQt5.QtWidgets import QOpenGLWidget
class Renderer(QOpenGLWidget):
def __init__(self):
QOpenGLWidget.__init__(self)
def sizeHint(self):
return QSize(700, 700)
def resizeEvent(self, event):
# Keeps 1:1 aspect ratio
if self.width() > self.height():
self.resize(self.height(), self.height())
elif self.height() > self.width():
self.resize(self.width(), self.width())
QOpenGLWidget.resizeEvent(self, event)
def paintGL(self):
glClearColor(1, 1, 1, 0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glPointSize(100)
glColor(1.0, 0.5, 0.2, 1.0)
glEnable(GL_POINT_SMOOTH)
glBegin(GL_POINTS)
points = [[0, 0, 0],
[-1, 1, 0],
[-1, -1, 0],
[1, -1, 0],
[1, 1, 0]]
for point in points:
glVertex(point[0], point[1], point[2])
glEnd()
self.update()
但是C++版本不是这样的。 C++版本的MRE:
#include "headers/renderer.h"
#include <QMainWindow>
#include <iostream>
Renderer::Renderer(MainWindow *parent)
{
this->parent = parent;
}
QSize Renderer::sizeHint() const {
return QSize(700, 700);
}
void Renderer::resizeEvent(QResizeEvent *event){
QOpenGLWidget::resizeEvent(event);
if (width() > height()){
resize(height(), height());
} else {
resize(width(), width());
}
}
void Renderer::initializeGL(){
initializeOpenGLFunctions();
}
void Renderer::paintGL(){
glClearColor(1, 1, 1, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPointSize(100);
glColor3f(1.0, 0.5, 0.2);
glEnable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
glVertex3i(0, 0, 0);
glVertex3i(-1, 1, 0);
glVertex3i(-1, -1, 0);
glVertex3i(1, -1, 0);
glVertex3i(1, 1, 0);
glEnd();
update();
}
我忘了放一个QOpenGLWidget::resizeEvent(事件);在调整大小事件中。完整代码在答案中。
我正在 QDockWidget 内的小部件上绘制东西,并且具有 1:1 平方纵横比。但是,未正确调整绘图表面的大小。
它应该如何工作:
工作原理:
代码只在角(坐标)处绘制了 4 个点,在中间绘制了另一个点
const float vertices[] = {
0.0f, 0.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
};
resizeEvent(保持 1:1 纵横比):
void Renderer::resizeEvent(QResizeEvent *event){
if (this->width() > this->height()){
this->resize(this->height(), this->height());
} else {
this->resize(this->width(), this->width());
}
}
我制作了一个 python MRE,效果很好:
from OpenGL.GL import (glClear, GL_COLOR_BUFFER_BIT, glEnable, glClearColor, GL_DEPTH_BUFFER_BIT, glBegin, glColor, glVertex, glEnd,
glPointSize, GL_POINT_SMOOTH, GL_POINTS)
from PyQt5.QtCore import QSize
from PyQt5.QtWidgets import QOpenGLWidget
class Renderer(QOpenGLWidget):
def __init__(self):
QOpenGLWidget.__init__(self)
def sizeHint(self):
return QSize(700, 700)
def resizeEvent(self, event):
# Keeps 1:1 aspect ratio
if self.width() > self.height():
self.resize(self.height(), self.height())
elif self.height() > self.width():
self.resize(self.width(), self.width())
QOpenGLWidget.resizeEvent(self, event)
def paintGL(self):
glClearColor(1, 1, 1, 0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glPointSize(100)
glColor(1.0, 0.5, 0.2, 1.0)
glEnable(GL_POINT_SMOOTH)
glBegin(GL_POINTS)
points = [[0, 0, 0],
[-1, 1, 0],
[-1, -1, 0],
[1, -1, 0],
[1, 1, 0]]
for point in points:
glVertex(point[0], point[1], point[2])
glEnd()
self.update()
但是C++版本不是这样的。 C++版本的MRE:
#include "headers/renderer.h"
#include <QMainWindow>
#include <iostream>
Renderer::Renderer(MainWindow *parent)
{
this->parent = parent;
}
QSize Renderer::sizeHint() const {
return QSize(700, 700);
}
void Renderer::resizeEvent(QResizeEvent *event){
QOpenGLWidget::resizeEvent(event);
if (width() > height()){
resize(height(), height());
} else {
resize(width(), width());
}
}
void Renderer::initializeGL(){
initializeOpenGLFunctions();
}
void Renderer::paintGL(){
glClearColor(1, 1, 1, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPointSize(100);
glColor3f(1.0, 0.5, 0.2);
glEnable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
glVertex3i(0, 0, 0);
glVertex3i(-1, 1, 0);
glVertex3i(-1, -1, 0);
glVertex3i(1, -1, 0);
glVertex3i(1, 1, 0);
glEnd();
update();
}
我忘了放一个QOpenGLWidget::resizeEvent(事件);在调整大小事件中。完整代码在答案中。