c++ - QGL小部件: Using setFormat() To Enable Multisampling = The Window Doesn't Close

标签 c++ qt events opengl

我正在使用 Qt4 在 OpenGL 中制作一个简单的三角形,它工作正常,直到我使用设置格式启用多重采样。这是我的代码:

#include <QApplication>
#include <QtOpenGL>
// gl window class
class GLWindow : public QGLWidget
{
public:
    GLWindow(QWidget *parent = nullptr)
        : QGLWidget(parent){}
protected:
    // ALL THE FOLLOWING FUNCTIONS ARE OVERRIDDEN FROM QGLWIDGET 
    void initializeGL()
    {
        QGLFormat newFormat = this->format();
        newFormat.setSampleBuffers(true);
        newFormat.setSamples(16);
        this->setFormat(newFormat);
    }
    void resizeGL(int w, int h)
    {
        glViewport(0, 0, w, h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-1, 1, -1, 1, -1, 1);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
    void paintGL()
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_TRIANGLES);
            glColor3f(1, 0, 0);
            glVertex2f(0, 1);
            glColor3f(0, 1, 0);
            glVertex2f(1, -1);
            glColor3f(0, 0, 1);
            glVertex2f(-1, -1);
        glEnd();
    }
};
// main function
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    GLWindow window;
    window.resize(640, 480);
    window.show();
    return app.exec();
}

在我在“initlializeGL”中添加格式内容之前,它工作正常(显然除了没有多重采样)。

然后,我添加了格式内容,但窗口没有关闭。当我这么说时,我的意思是当我按下右上角的“X”按钮时它不会关闭,或者当我调用窗口的“close()”函数时它甚至不会关闭。

此外,当您按下“X”按钮(我检查过)时,它会调用“closeEvent()”,但实际上没有任何关闭。我尝试在覆盖的“closeEvent()”函数中调用“close()”,但它什么也没做。

再一次,我删除了“initializeGL()”中的代码,然后它正常关闭。因此,我尝试将“initializeGL()”中的代码移动到构造函数中。多重采样有效,当我按下“X”时它会关闭。伟大的!除了我在窗口关闭后得到这个:

enter image description here

就是这样。简而言之:

  • 当“initializeGL()”中没有“setFormat()”相关代码时一切正常。
  • 当我将“setFormat()”相关代码放入“initializeGL()”时,窗口没有关闭。
  • 当我将我的“setFormat()”相关代码放入构造函数时,当窗口关闭时出现上图所示的奇怪错误;

那么如何让窗口关闭,同时保持多重采样启用并且在窗口关闭后不会出现一些愚蠢的错误?

编辑:这是我的 .pro 文件中的文本

QT += core
QT += gui
QT += opengl

SOURCES += \
    main.cpp

最佳答案

你不应该调用 setFormat来自 initializeGL ,因为它会触发对 initializeGL 的调用本身。自 QGLWidget::setFormatobsolete在 Qt 4.8 中,您根本不应该使用它。

所以,首先尝试调用 setFormat从构造函数,然后,如果它不起作用(或者即使它起作用),请尝试将格式传递给 QGLWidget 的构造函数来自 main() .

关于c++ - QGL小部件: Using setFormat() To Enable Multisampling = The Window Doesn't Close,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713184/

相关文章:

在 map 中搜索值的 C++ 类和方法

c++ - 使用 QtCreator,如何在我具有 ssh 访问权限的远程服务器上构建我的项目?

events - 信号和槽 vs. 事件和事件监听器

javascript - 我可以使用谷歌地图Api捕获渲染事件吗

JavaScript 类型错误 : var is not a function

c++ - 将多个非数字插入 std::unordered_set<double>

连接到 IPv4 地址时 C++ winsock 连接被拒绝

c++ - 调整窗口大小时如何为 `fitInView`?

c++ - 从 USB 设备中的设备路径获取卷名称

c++ - 将指向成员函数的指针作为返回值传递给 QObject::connect()