- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Qt 中非常有效地绘制基本的 2D 形状(正方形),因此我继承了 QOpenGLWidget 如下:
WatorOpenGLWidget.hpp
#include <QOpenGLWidget>
#include <QPainter>
#include "Environment.hpp"
#ifndef WATOROPENGLWIDGET_HPP
#define WATOROPENGLWIDGET_HPP
class WatorOpenGLWidget : public QOpenGLWidget
{
private:
Environment* environment;
public:
WatorOpenGLWidget(QWidget* widget, Environment* environment);
void initializeGL() override;
void paintGL() override;
void resizeGL(int w, int h) override;
void setEnvironment(Environment *e) {this->environment = e;};
};
#endif // WATOROPENGLWIDGET_HPP
WatorOpenGLWidget.cpp
#include "WatorOpenGLWidget.hpp"
#include <iostream>
WatorOpenGLWidget::WatorOpenGLWidget(QWidget* widget, Environment* e): QOpenGLWidget(widget), environment(e){
}
void WatorOpenGLWidget::initializeGL() {
glClearColor(0, 0, 0, 1);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
void WatorOpenGLWidget::paintGL(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
QPainter painter(this);
painter.setBrush(QBrush(Qt::blue));
painter.drawRect(0, 0, 3 * environment->getWidth(), 3 * environment->getHeight());
std::vector<Agent*> agents = environment->getAgents();
for(uint32_t i = 0; i < agents.size(); i++){
painter.setBrush(agents[i]->getColor());
painter.drawRect(agents[i]->getX() * 3, agents[i]->getY() * 3, 3, 3);
}
}
void WatorOpenGLWidget::resizeGL(int w, int h){
glViewport(0, 0, w, h);
}
我创建了我的自定义小部件
WatorOpenGLWidget 从主窗口类:
#include "Mainwindow.hpp"
#include "ui_mainwindow.h"
#include "Environment.hpp"
#include "Fish.hpp"
#include "Shark.hpp"
#include <iostream>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateEnvironment()));
timer->start(20);
tick = 0;
initializeEnvironment();
opengl_widget = new WatorOpenGLWidget(nullptr, environment);
opengl_widget->setFixedSize(3 * environment->getWidth(), 3 * environment->getHeight());
ui->scrollAreaWidgetContents->layout()->addWidget(opengl_widget);
updateGUI();
}
void MainWindow::initializeEnvironment(){
this->environment = new Environment(100, 100, 0);
std::vector<Agent*> agents;
for(uint32_t i = 0; i < 5000; i++){
agents.push_back(new Fish());
}
for(uint32_t i = 0; i < 1000; i++){
agents.push_back(new Shark());
}
this->environment->placeAgents(agents);
}
void MainWindow::updateEnvironment(){
initializeEnvironment();
std::vector<Agent*> agents = environment->getAgents();
for(uint32_t i = 0; i < agents.size(); i++){
agents[i]->decide();
}
updateGUI();
}
void MainWindow::updateGUI(){
opengl_widget->setEnvironment(environment);
opengl_widget->paintGL();
tick++;
std::string tick_text = "tick " + std::to_string(tick);
ui->tickLabel->setText(QString::fromStdString(tick_text));
}
MainWindow::~MainWindow()
{
delete timer;
delete environment;
delete ui;
}
每次计时器触发时绘图都可以正常工作,但是在运行时会生成以下输出:
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setBrush: Painter not active
QPainter::drawRects: Painter not active
QPainter::setBrush: Painter not active
QPainter::drawRects: Painter not active
QPainter::setBrush: Painter not active
QPainter::drawRects: Painter not active
我应该怎么做才能防止这种情况发生?使用 QPainter 对象是否比使用 OpenGL 原生函数更消耗 CPU?
最佳答案
你不应该调用 paintGL()
直接调用update()
将调用 paintEvent()
的方法方法,这又会调用 paintGL()
.
void MainWindow::updateGUI(){
opengl_widget->setEnvironment(environment);
opengl_widget->update();
tick++;
ui->tickLabel->setText(QString("tick %1").arg(tick));
}
关于c++ - Painter 在继承的 QOpenGLWidget 类上不活动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64158603/
与my other question相关,我正在尝试渲染分割蒙版以启用对象拾取。但是我无法达到预期的结果。 选项 1 根本不起作用。我无法检索颜色附件 1 的内容,也无法检查它是否存在(我仅使用 na
我只是想知道 Qt 上的 QOpenGLWidget(我使用的是 5.4 版)是否可以在没有子类化的情况下使用。 在 Qt Creator 表单编辑器中,有一个 Display 小部件可以插入到名为“
以前我用 opengl 创建 qt 应用程序有困难,我总是设法用 SDL 或 glfw + glew 创建一个纯 opengl 应用程序。 但我按照大家在视频中所做的程序,创建了一个派生自 QOpen
我正在使用 Qt 和 OpenGL 开发 3D 应用程序。该应用程序由 QMainWindow 和 QOpenGLWidget 作为中央小部件和 QML UI 作为停靠小部件组成。我意识到用户输入和
我在 QMainWindow 实例 w 中嵌入了一个 QOpenGLWidget。编译正常。但是在调试时,程序在 w.show() 处崩溃。 错误对话框显示: Exception thrown at
我正在尝试使用四边形作为纹理,使用 QOpenGLWidget 渲染一个简单的二维图像。但无论我尝试什么,我总是得到一个黑盒子。 我看了很多教程,我有一个像这样的简单像素缓冲区 uchar* m_pD
你是我解决这个问题的最后手段,因为我没有想法。所以首先,我已经完成了一些 openGL 的工作,但没有使用 Qt 库。 由于 Qt Android 编译器,我必须使用 Qt 库来完成它,所以我别无选择
我对QOpenGLWidget和它的背景颜色有一点小问题。。当我想使用QPainter在我的自定义QOpenGLWidget上创建半透明的RECT时,有两种不同的结果:。以下是QPainter的代码示
我想将第二个渲染目标添加到 QOpenGLWidget 的默认帧缓冲区。 原因是我想通过将分割掩码渲染到 gl_FragData[1] 来实现对象拾取并检查用户是否击中对象。不幸的是,您只能从小部件中
我正在尝试使用 QOpenGLWidget 来显示一些图像,而不是使用 QLabel。但我对如何做到这一点感到有点困惑。 为了让小部件完成工作,我知道我需要重新实现 initializeGL() 方法
我有一个隐藏的 QOpenGLWidget(Qt 5.4.2,不是 QGLWidget),我想基本上不断地执行grab()或grabFramebuffer()来获取其内容(并将其写入磁盘)。该小部件在
我正在尝试编写一个使用 QOpenGLWidget 的 C++ 应用程序,但是 Qt Creator 在这一行给出了“‘QOpenGLWidget’文件未找到”错误: #include 文档说 QO
我正在尝试使用 QOpenGLWidget 而无需子类化。 当我尝试在 QOpenGLWidget 的方法或信号之外进行 OpenGL 调用时,似乎什么也没有发生。例如,尽管我设置了 glClearC
你好,我有一个基于 Qt 使用 QOpenGLWidget 的应用程序。在 OpenGL 小部件(在我的代码中名为 oglwidget)中,我使用 opengl 函数绘制网格和线条。然后我使用 QPa
我想解决我仍在处理的问题..那就是在不同的顶级窗口中使用共享着色器程序等同时渲染 2 个 QOpenGLWidgets。 我的第一次尝试是使用一个上下文,但没有成功。 目前 QOpenGLWidget
我一直在使用带有 QOpenGLWindow 的着色器文件并使用版本 330 着色器,一切正常。但是想要切换为 Widget 以便能够将其停靠在我的应用程序主窗口中。从那以后,我一直在努力获得正确的上
我们有一个基于 QWidget 的应用程序,它以前使用 QWindow 进行 OpenGL 渲染。为了在我们的应用程序中适应该窗口,我们必须使用 QWidget QWidget::createWind
我正在尝试使用 QOpenGLWidget 在 Qt 内部使用 OpenGL,但我很难找到任何相关示例。我是 OpenGL 的新手,所以我想学习如何使用它,但我发现的教程似乎在 QOpenGLWidg
我想在 QOpenGLWidget 上绘制文本标签。我尝试使用 QPainter 来完成此任务,但没有成功 - 文本看起来很丑陋且没有抗锯齿。它在 Qt OpenGL/2dpainting 示例中看起
调试时的确切崩溃是: The inferior stopped because it triggered an exception. Stopped in thread 0 by: Exception
我是一名优秀的程序员,十分优秀!