gpt4 book ai didi

c++ - Qt:glClear 不适用于 OpenGL 上的过度绘制

转载 作者:行者123 更新时间:2023-11-30 05:09:01 26 4
gpt4 key购买 nike

问题

QPainterglClear 之后创建时,后者无效。

描述

我使用 Qt 5.7.1。我在 Linux 上使用 gcc 和在 Windows 上使用 vc++ 得到相同的结果。

我在派生自 QGLWidget 的小部件中有以下内容:

void CanvasWidget::initializeGL()
{
qglClearColor(m_backgroundColor);
}

V1:

void CanvasWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
QPainter painter(this);
painter.drawLine(0, 0, 1000, 1000);
}

产生:

enter image description here

V2:

void CanvasWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
}

产生:

enter image description here

我想要的是:

enter image description here

这可以通过黑客来完成:

void CanvasWidget::paintGL()
{
QPainter painter(this);
qglClearColor(m_backgroundColor);
glClear(GL_COLOR_BUFFER_BIT);
painter.drawLine(0, 0, 1000, 1000);
}

问题

这是怎么回事?为什么 glCleanQPainter 不能一起工作?为什么我不能用 V1 获取它?

最小可重现示例

main.cpp

#include "MainWindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainwindow;
mainwindow.show();
return app.exec();
}

MainWindow.h

#pragma once

#include "CanvasWidget.h"
#include <QMainWindow>
#include <memory>

class MainWindow : public QMainWindow
{
public:
explicit MainWindow(QWidget *parent = 0);

MainWindow(const MainWindow &) = delete;
MainWindow & operator= (const MainWindow &) = delete;
virtual ~MainWindow() = default;

private:
std::unique_ptr<CanvasWidget> m_canvasWidget;
};

MainWindow.cpp

#include "MainWindow.h"
#include <QHBoxLayout>

MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent)
, m_canvasWidget(new CanvasWidget(parent))
{
setCentralWidget(m_canvasWidget.get());
}

CanvasWidget.h

#pragma once

#include <QGLWidget>

class CanvasWidget : public QGLWidget
{
Q_OBJECT
public:
CanvasWidget(QWidget* parent = 0, const QGLWidget* shareWidget = 0, Qt::WindowFlags f = 0);
private:
virtual void initializeGL() override;
virtual void paintGL() override;
private:
QColor m_backgroundColor;
};

CanvasWidget.cpp

#include "CanvasWidget.h"
#include <QMessageBox>
#include <QWheelEvent>

CanvasWidget::CanvasWidget(
QWidget* parent /*= 0*/,
const QGLWidget* shareWidget /*= 0*/,
Qt::WindowFlags f /*= 0 */)
: QGLWidget(parent, shareWidget, f)
, m_backgroundColor(0, 93, 196)
{}

void CanvasWidget::initializeGL()
{
qglClearColor(m_backgroundColor);
}

void CanvasWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
QPainter painter(this);
painter.drawLine(0, 0, 1000, 1000);
}

最佳答案

CanvasWidget 构造函数中添加 setAutoFillBackground(false) 解决了这个问题。

所有功劳归功于@G.M.

关于c++ - Qt:glClear 不适用于 OpenGL 上的过度绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46410731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com