qt 调用qpainter_QT OpenGL和QPainter的结合

本文介绍如何在Qt的QGLWidget中结合OpenGL和QPainter进行3D及2D图形的绘制。示例代码展示了VowelCube类,它继承自QGLWidget,利用QPainter绘制渐变背景和文字,同时使用OpenGL绘制立方体。在构造函数中设置渐变效果和创建OpenGL对象,paintEvent()中分别处理背景、立方体和图例的绘制。注意在使用OpenGL时需要保存和恢复状态,以避免影响QPainter的显示。在实际应用中,可能需要注释掉特定代码行以解决编译错误,并避免开启GL_CULL_FACE导致QPainter显示问题。
摘要由CSDN通过智能技术生成

QT中可以在QGLWidget上使用OpenGL命令绘制一个三维场景,也可以使用QPainter在QGLWidget上绘制二维图形。如下图Vowel

Cube例子。详见 Jasmin Blanchette写的C++ GUI Programming with Qt 4,

second edition

VowelCube类派生自QGLWidget,使用QPainter绘制背景的渐变,然后使用OpenGL调用绘制立方体,接着使用renderText()绘制立方体角上的8个字母,最后使用QPainter和QTextDocument绘制图例。用户可以单击并拖动鼠标来旋转立方体,并且可以使用鼠标滚轮进行放大和缩小。

为有利于更新OpenGL的帧缓存,不使用QGLWidget的高级函数initialGL()、resizeGL()、paintGL(),而是采用QWidget的paintEvent().

可以在构造函数中调用createGradient()设置用来填充背景的QRadialGradient,并且调用createGLObject()创建OpenGL立方体对象,一遍稍后迅速重绘场景。构造函数中创建的OpenGL列表用来保存绘制的立方体的边,可以在析构函数中通过调用glDeleteLists()删除。

在paintEvent中,像普通的QWidget一样来设置QPainter,然后绘制背景、立方体以及图例。

绘制背景就是使用合适的画刷调用drawRect().本例中就是构造函数中创建的QRadialGradient。使用OpenGL绘制立方体时必须保存修改的OpenGL状态,包括属性、投影矩阵和模式视图矩阵。最后在适当的时候再恢复它。

本例的paintEvent实现具有以下通用模式

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个使用QtOpenGL绘制滚动图片的程序。它使用QOpenGLWidget类来创建一个OpenGL上下文,然后使用OpenGL函数来绘制图像,并在每个帧之间使用QTimer类来更新图像的位置。 #include <QtWidgets/QApplication> #include <QtWidgets/QOpenGLWidget> #include <QtCore/QTimer> #include <QtGui/QImage> #include <QtGui/QPainter> class ScrollImage : public QOpenGLWidget { public: ScrollImage(QWidget* parent = nullptr) : QOpenGLWidget(parent) { QTimer* timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &ScrollImage::updatePosition); timer->start(16); } void setImage(const QImage& image) { m_image = image; update(); } protected: void initializeGL() override { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glEnable(GL_TEXTURE_2D); glGenTextures(1, &m_textureId); glBindTexture(GL_TEXTURE_2D, m_textureId); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT); if (!m_image.isNull()) { QImage image = m_image.mirrored(false, true); // Flip the image vertically glBindTexture(GL_TEXTURE_2D, m_textureId); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, image.bits()); glBegin(GL_QUADS); glTexCoord2f(0.0f, m_position); glVertex2f(-1.0f, 1.0f); glTexCoord2f(1.0f, m_position); glVertex2f(1.0f, 1.0f); glTexCoord2f(1.0f, m_position - 1.0f); glVertex2f(1.0f, -1.0f); glTexCoord2f(0.0f, m_position - 1.0f); glVertex2f(-1.0f, -1.0f); glEnd(); } } void resizeGL(int width, int height) override { glViewport(0, 0, width, height); } private: void updatePosition() { m_position += 0.02f; if (m_position > 1.0f) { m_position = 0.0f; } update(); } QImage m_image; GLuint m_textureId = 0; float m_position = 0.0f; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); QImage image(":/image.jpg"); if (image.isNull()) { qCritical() << "Failed to load image"; return -1; } ScrollImage w; w.setGeometry(100, 100, image.width(), image.height()); w.setWindowTitle("Scroll Image"); w.setImage(image); w.show(); return a.exec(); } 要运行此程序,您需要将一张名为“image.jpg”的图像添加到您的项目中,并将其路径添加到QImage构造函数中。运行程序后,您将看到图像从上到下滚动。每秒大约更新60次,因为定时器更新率为每16毫秒一次。您可以通过调整计时器时间来更改更新率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值