- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要向现有的 Qt 应用程序添加一些 3D 图形。我使用的是 Qt 5.2,但我使用的是旧的 QGL* 类,至少目前是这样。首先,我只想画一个三角形。
我本来可以正常工作,但后来我尝试通过调用 QGLWidget::setFormat 显式设置 OpenGL 版本,突然间我的三角形不再绘制了。我注释掉了我实际设置版本的那一行,它没有任何区别:用 QGLWidget::format 返回的值调用 QGLWidget::setFormat 突然使绘图不发生。发生了什么事?
测试GL.cpp:
#include <QApplication>
#include <QDialog>
#include <QVBoxLayout>
#include "GLWidget.h"
class GLDialog : public QDialog
{
public:
GLDialog()
{
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(new GLWidget);
}
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
GLDialog dlg;
dlg.resize(200,200);
dlg.show();
return app.exec();
}
GLWidget.h:
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QColor>
#include <QGLWidget>
#include <QVector>
#include <QVector3D>
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
GLWidget(QWidget * = 0, const QGLWidget * = 0, Qt::WindowFlags = 0);
protected:
virtual void initializeGL();
virtual void paintGL();
virtual void resizeGL(int, int);
//virtual void mousePressEvent(QMouseEvent *);
//virtual void mouseMoveEvent(QMouseEvent *);
private:
QVector<QVector3D> _triangle;
QColor _backgroundColour;
QColor _triangleColour;
};
#endif
GLWidget.cpp:
#include <QtOpenGL>
#include <QGLContext>
#include <QGLFormat>
#include <QGLShader>
#include <QGLShaderProgram>
#include <QDebug>
#include "GLWidget.h"
GLWidget::GLWidget(QWidget *parent, const QGLWidget *shareWidget, Qt::WindowFlags f)
: QGLWidget(parent, shareWidget, f)
{
QGLFormat newFormat(format());
//newFormat.setVersion(3,3);
/* Comment out the following line and a triangle appears */
setFormat(newFormat);
}
void GLWidget::initializeGL()
{
_backgroundColour = Qt::black;
_triangleColour = Qt::white;
_triangle.push_back(QVector3D(-0.75, 0.75, 0));
_triangle.push_back(QVector3D(-0.75, -0.75, 0));
_triangle.push_back(QVector3D(0.75, -0.75, 0));
}
void GLWidget::paintGL()
{
qglClearColor(_backgroundColour);
glClear(GL_COLOR_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, _triangle.constData());
glDrawArrays(GL_TRIANGLES, 0, 3);
}
void GLWidget::resizeGL(int width, int height)
{
int side = qMin(width, height);
int hoffset = (int)((width - side) / 2.0 + 0.5);
int voffset = (int)((height - side) / 2.0 + 0.5);
glViewport(hoffset, voffset, side, side);
}
testGL.pro:
######################################################################
# Automatically generated by qmake (3.0) Fri Apr 18 16:09:15 2014
######################################################################
TEMPLATE = app
TARGET = testGL
INCLUDEPATH += .
CONFIG += qt warn_on debug
QT += opengl
# Input
HEADERS += GLWidget.h
SOURCES += GLWidget.cpp testGL.cpp
我是 OpenGL 的初学者,所以请原谅我的代码愚蠢。请注意,我没有明确设置着色器。那将是我的下一步。
更新:
我关注了this advice并使用带有 QGLFormat 对象的备用 QGLWidget 构造函数。我得到了一些有趣的行为。
新的 GLDialog 代码:
class GLDialog : public QDialog
{
public:
GLDialog()
{
QVBoxLayout *layout = new QVBoxLayout(this);
QGLFormat format;
/* Comment this line out or change to 2,0 to get a triangle */
format.setVersion(3,0);
layout->addWidget(new GLWidget(format,this));
}
};
在 GLWidget 构造函数中输出此格式字符串:
QGLFormat(options QFlags(0x1|0x2|0x4|0x8|0x20|0x80|0x400) , plane 0 , depthBufferSize 24 , accumBufferSize -1 , stencilBufferSize 8 , redBufferSize 8 , greenBufferSize 8 , blueBufferSize 8 , alphaBufferSize 8 , samples -1 , swapInterval -1 , majorVersion 3 , minorVersion 3 , profile 1 )
如果我注释掉指示的行:
QGLFormat(options QFlags(0x1|0x2|0x4|0x8|0x20|0x80|0x400) , plane 0 , depthBufferSize 24 , accumBufferSize -1 , stencilBufferSize 8 , redBufferSize 8 , greenBufferSize 8 , blueBufferSize 8 , alphaBufferSize 8 , samples -1 , swapInterval -1 , majorVersion 3 , minorVersion 0 , profile 0 )
如果我将请求的版本更改为 2.0:
QGLFormat(options QFlags(0x1|0x2|0x4|0x8|0x20|0x80|0x400) , plane 0 , depthBufferSize 24 , accumBufferSize -1 , stencilBufferSize 8 , redBufferSize 8 , greenBufferSize 8 , blueBufferSize 8 , alphaBufferSize 8 , samples -1 , swapInterval -1 , majorVersion 3 , minorVersion 0 , profile 0 )
最佳答案
在我调用 setFormat() 之后,在我的 GLWidget 构造函数中调用 makeCurrent() 就可以了。使用 Qt 5.2,设置格式实际上并没有给我请求的格式(即,请求 OpenGL 2.1 实际上设置了 OpenGL 3.0,而请求 3.0 实际上设置了 3.3)。虽然我的系统支持 OpenGL 3.3,但除非使用的版本是 3.0 或更低版本,否则我不会得到三角形。但是设置版本有效。
对采用 QGLFormat 对象的备用构造函数的调用也有效(直到 3.0 版...同样,请求 3.0 给我 3.3,请求 2.1 给我 3.0)。
使用Qt 4.8,同样的代码可以工作,并且可以请求到3.3版本,我请求的版本就是我得到的版本。
一个工作示例:
测试GL.cpp:
#include <QApplication>
#include <QDialog>
#include <QGLFormat>
#include <QVBoxLayout>
#include <QDebug>
#include "GLWidget.h"
class GLDialog : public QDialog
{
public:
GLDialog()
{
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(new GLWidget(this));//format,this));
}
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
GLDialog dlg;
dlg.resize(200,200);
dlg.show();
return app.exec();
}
GLWidget.h:
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QColor>
#include <QGLWidget>
#include <QGLFormat>
#include <QGLFunctions>
#include <QGLShader>
#include <QGLShaderProgram>
#include <QVector>
#include <QVector3D>
class GLWidget : public QGLWidget, protected QGLFunctions
{
Q_OBJECT
public:
GLWidget(QWidget * = 0, const QGLWidget * = 0, Qt::WindowFlags = 0);
protected:
virtual void initializeGL();
virtual void paintGL();
virtual void resizeGL(int, int);
private:
QVector<QVector3D> _triangle;
QColor _backgroundColour;
};
#endif
GLWidget.cpp:
#include <QtOpenGL>
#include <QGLContext>
#include <QGLFormat>
#include <QDebug>
#include <string>
#include <cstring>
#include "GLWidget.h"
GLWidget::GLWidget(QWidget *parent, const QGLWidget *shareWidget, Qt::WindowFlags f)
: QGLWidget(parent, shareWidget, f)
{
QGLFormat newFormat(format());
newFormat.setVersion(2,1);
setFormat(newFormat);
makeCurrent();
resizeGL(width(), height());
}
void GLWidget::initializeGL()
{
_backgroundColour = Qt::black;
_triangle.push_back(QVector3D(-0.75, 0.75, 0));
_triangle.push_back(QVector3D(-0.75, -0.75, 0));
_triangle.push_back(QVector3D(0.75, -0.75, 0));
}
void GLWidget::paintGL()
{
qglClearColor(_backgroundColour);
glClear(GL_COLOR_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, _triangle.constData());
glDrawArrays(GL_TRIANGLES, 0, 3);
}
void GLWidget::resizeGL(int width, int height)
{
int side = qMin(width, height);
int hoffset = (int)((width - side) / 2.0 + 0.5);
int voffset = (int)((height - side) / 2.0 + 0.5);
glViewport(hoffset, voffset, side, side);
}
testGL.pro:
######################################################################
# Automatically generated by qmake (3.0) Fri Apr 18 16:09:15 2014
######################################################################
TEMPLATE = app
TARGET = testGL
INCLUDEPATH += .
CONFIG += qt warn_on debug
QT += opengl
# Input
HEADERS += GLWidget.h
SOURCES += GLWidget.cpp testGL.cpp
关于c++ - 调用 QGLWidget::setFormat = 无绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23379995/
我正在使用带有 PySide 绑定(bind)的 python 中的 Qt。我的应用程序的主要部分是可以调整到特定值的 OpenGL View (这是一个模拟器,用于在移动设备的不同分辨率下测试我的游
我是QT新手,有问题。我从http://qt.nokia.com/downloads/sdk-windows-cpp下载了用于开源C++开发的Qt SDK,并在PATH中添加了C:\QT\2010.0
我想在 QGLWidget 中显示 OptixSDK 的示例 6。 我的应用程序只有 3 个 QSlider 用于绕 X、Y、Z 轴和 QGLWidget 旋转。 据我了解,每当我的 QSlider
我正在 Qt 中制作一个 GUIon,我正在使用 QGLWidgt 来显示对象的运动。为了调试目的,我在矩阵上进行了硬编码以尝试显示茶壶,但屏幕上没有显示任何内容。我尝试了很多东西,我只是不知道出了什
基本上我想在 Text Edit 小部件上显示按下的按钮。 Key 事件适用于 GLWidget。如何与 GLWidget 中的 MainWindow 小部件进行交互?到目前为止,这是我的代码, 主窗
我基本上想做的是创建一个 QGLWidget 的实例(或者更确切地说是 QGLWidget 的派生类),将它添加到 QMainWindow ,然后从我的 QTCreator 程序中的任何地方访问 QG
我有一个 Qt 应用程序,它在 Mac OS 上使用 OpenGL 绘图和 QGLWidget。在我的 MBP 上运行良好,但在 30"屏幕上尝试时,我注意到存在窗口大小限制。 如果我将窗口大小增加到
我想编写一个单线程应用程序来显示两个 QGLWidget(一个用于 3D,一个用于 2D)。我试图找到有关同时显示的两个 QGLWidgets 的信息,但没有找到任何对我有帮助的信息。 现在,我认为我
我看了很多关于 OpenGL 不绘图、常见错误等的文章和 SO 问题。这个让我很困惑。 我已经为 glOrtho 尝试了几种不同的设置、不同的顶点位置、颜色等,但都无济于事。 我可以确认 OpenGL
我有小部件: class Main_Widget : public QWidget { Q_OBJECT public: explicit Main_Widget(QWidget *p
是否可以使用 Qt 在 QGLWidget 中完全脱离屏幕进行渲染,而无需将场景重新绘制到屏幕,从而避免缓冲区在监视器上完全翻转? 我需要保存在帧缓冲区上生成的每一帧,但是,由于序列由 4000 帧组
我是 OpenGL 和 Qt 的新手,我正在同时学习这两者(已经 3 天了:)。几年前,我用 DirectX 做了一些实验,我清楚地记得在那里制作全屏窗口是可能的。我所说的全屏是指真正的全屏,即使顶部
我正在上传大量纹理(每秒 60 个 VGA 图像)并且它阻塞了我的 UI 线程。来自 the Qt 5.1 QGLWidget manual page (强调我的): Texture uploadin
我正在使用 QGraphicsView显示 2D 图像并有一个单独的 QGLWidget窗口以显示一些 3D 对象。我正在根据 3D 对象的旋转动态更改“QGraphicsView”中显示的图像。 我
我有两个计时器来重新绘制 QGLWidget 并确定 FPS QObject::connect(&fpsTimer, SIGNAL(timeout()), this, SLOT(updateFps()
我有一种流媒体应用程序,它应该捕获窗口的内容。在窗口中,一个 QGLWidget 绘制了东西。目前我在每个绘制周期中都使用 widget.grabFrameBuffer(必须是实时的)。该应用使用 1
我有一个 QGLWidget,我在其中渲染一个动态网格。我想做的是录制我在此窗口中查看的视频。如果可能的话,我想使用 Qt 的低级多媒体库或高级 Phonon。 非常感谢您的想法! 最佳答案 在最新版
我想知道是否有比这更好的解决方案:我有一个渲染代码和一个颜色选择代码,我已经共享了这两个代码(VBO 等)之间可以共享的所有内容,我的代码看起来像: void paintGL() { label1:
我想使用 QGLWidget、QGraphicsScene 和 QGraphicsView 创建一个简单的缩略图查看器。我在将 QGLWidget 放在 QGraphicsScene 上时遇到问题。代
我一直在尝试在 QGLWidget 中渲染立方体,但结果是错误的。无论我如何旋转它,它看起来都像一个扁平的正方形。就像它没有注意到它顶点的 Z 坐标一样。就在我添加 GL_DEPTH_BUFFER_B
我是一名优秀的程序员,十分优秀!