- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在准备一个桌面应用程序来绘制一些二维图。我正在使用 C++:Qt 5 和 visual studio 2013。我创建了一个简单的 GUI 并将 myQOpenGLWidget 放入其中。我已经在使用我自己的 openGl 着色器绘制绘图、坐标轴和刻度线。一切正常,现在我想将描述添加到我的轴和刻度中,以使图表可以进行分析。由于在 OpenGL 本身中没有专门的函数来渲染文本,我想出了使用 QPainter 对象只是为了将所需的描述添加到已经创建的绘图中。这里有问题开始......
这是我的 QopenGLWidget 实现的功能:
void GLWidget::initializeGL() {
initializeOpenGLFunctions();
glEnable(GL_POINT_SPRITE);
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
vertexShad = new QOpenGLShader(QOpenGLShader::Vertex);
fragmentShad = new QOpenGLShader(QOpenGLShader::Fragment);
bool flag = vertexShad->compileSourceFile(QString("vs.glsl"));
if (flag) printf("compiled vertex Shader\n");
flag = fragmentShad->compileSourceFile(QString("fs.glsl"));
if (flag) printf("compiled fragment Shader\n");
flag = program.addShader(vertexShad);
if (flag) printf("linked vertex Shader\n");
flag = false;
flag =program.addShader(fragmentShad);
if (flag) printf("linked fragment Shader\n");
program.link();
program.bind();
}
绘制GL:
void GLWidget::paintGL() {
painter = new QPainter(this);
painter->beginNativePainting();
glViewport(0, 0, this->width(), this->height());
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
drawAxes();
glViewport(MARGIN, MARGIN, this->width() - MARGIN * 2, this->height() - MARGIN * 2);
glScissor(MARGIN, MARGIN, this->width() - MARGIN * 2, this->height() - MARGIN * 2);
glEnable(GL_SCISSOR_TEST);
// here are the functions which use native openGL code
// ...
// disabling openGL settings
glDisable(GL_SCISSOR_TEST);
glDisable(GL_POINT_SPRITE);
glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
glDisable(GL_BLEND);
painter->endNativePainting();
drawTicksValues(); // function that uses QPainter
painter->end();
}
drawTicksValues:
void GLWidget::drawTicksValues() {
char * maxText = new char[4];
sprintf(maxText, "%d", maxY);
char * minText = new char[4];
sprintf(minText, "%d", minY);
painter->drawText(0, MARGIN, QString(maxText));
painter->drawText(0, height() - MARGIN, QString(minText));
painter->drawText(MARGIN, height() - MARGIN + 20, QString("0"));
painter->drawText(width() - MARGIN, height() - MARGIN + 20, QString(100));
}
主要内容:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSurfaceFormat format;
format.setSamples(4);
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
QSurfaceFormat::setDefaultFormat(format);
SymmGaitModels w;
w.show();
return a.exec();
}
不幸的是,当我运行代码时,对于未注释的 QPainter
部分,轴和图被清除,只显示我用 QPainter 绘制的数字。但是如果我评论 QPainter 部分,绘图和轴就会正常绘制。关于如何使用 QPainter 将文本添加到我的绘图而不是清除它,有什么建议吗?
最佳答案
我终于成功了。
首先,我必须更改并设置格式(您必须在显示小部件之前更改它),例如在 main 函数中,在我的应用程序显示之前
主要内容:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SymmGaitModels w;
// GLWidget is my implemantation of QOpenGLWidget
GLWidget* gl = w.findChild<GLWidget*>("OpenGLWidget");
QSurfaceFormat format;
//format.setSamples(4);
//format.setDepthBufferSize(24);
//format.setStencilBufferSize(8);
format.setProfile(QSurfaceFormat::OpenGLContextProfile::CompatibilityProfile);
QSurfaceFormat::setDefaultFormat(format);
gl->setFormat(format);
w.show();
return a.exec();
}
此外,我不得不在
QPainter-> beginNativePainting()
...
QPainter->endNativePainting();
而且我必须实现 paintEvent 函数。我只是把 paintGL() 表达式放在那里。现在我的函数看起来像这样:
void GLWidget::initializeGL() {
printf("autoFILL: %d\n",this->autoFillBackground());
initializeOpenGLFunctions(); // this function has to stay in initializeGL
// commented functions below has to be removed and put after beginNativePainting
//glEnable(GL_POINT_SPRITE);
//glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
//glEnable(GL_BLEND);
//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// shaders may be compiled and added here, but program has to be linked and built after beginNativePainting()
vertexShad = new QOpenGLShader(QOpenGLShader::Vertex);
fragmentShad = new QOpenGLShader(QOpenGLShader::Fragment);
bool flag = vertexShad->compileSourceFile(QString("vs.glsl"));
//bool flag = vertexShad->compileSourceCode(vertexShadSrc);
if (flag) printf("compiled vertex Shader\n");
flag = fragmentShad->compileSourceFile(QString("fs.glsl"));
//flag = fragmentShad->compileSourceCode(fragmentShadSrc);
if (flag) printf("compiled fragment Shader\n");
flag = program.addShader(vertexShad);
if (flag) printf("linked vertex Shader\n");
flag = false;
flag =program.addShader(fragmentShad);
if (flag) printf("linked fragment Shader\n");
}
void GLWidget::paintEvent(QPaintEvent *e) {
paintGL(); // still this, widget has to be now refreshed by widget->update()
}
void GLWidget::paintGL() {
painter = new QPainter(this);
painter->beginNativePainting();
//
glEnable(GL_POINT_SPRITE);
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
program.link();
program.bind();
//
glViewport(0, 0, this->width(), this->height());
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
drawAxes();
glViewport(MARGIN, MARGIN, this->width() - MARGIN * 2, this->height() - MARGIN * 2);
glScissor(MARGIN, MARGIN, this->width() - MARGIN * 2, this->height() - MARGIN * 2);
glEnable(GL_SCISSOR_TEST);
// methods using native openGL functions here
glDisable(GL_SCISSOR_TEST);
glDisable(GL_POINT_SPRITE);
glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
glDisable(GL_BLEND);
program.disconnect();
painter->endNativePainting();
drawTicksValues();
painter->end();
}
添加 paintEvent 实现后,现在必须使用 widget->update() 刷新 openGL 小部件。
希望它对其他正在努力使用 QPainter 和 native openGL 函数的人有所帮助,因为 Qt 文档在这个主题上似乎有点肤浅。
谢谢!亚当
关于c++ - QPainter 和 QOpenGLWidget 类中的 OpenGL native 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29622979/
与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
我是一名优秀的程序员,十分优秀!