QDockWidget 中小部件的错误 OpenGL 视口

我正在 QDockWidget 内的一个小部件上绘制东西,并且具有 1:1 的平方纵横比。但是,未正确调整绘图表面的大小。

它应该如何工作:

https://i.stack.imgur.com/UvK25.gif

怎么运行的:

https://i.stack.imgur.com/XQeXv.gif

该代码仅在角(坐标)处绘制 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);

}

斯蒂芬大帝
浏览 168回答 1
1回答

波斯汪

我忘了放一个 QOpenGLWidget::resizeEvent(event);&nbsp;在调整大小事件中。完整代码在答案中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python