我想使用QGLWidget显示图像,但它没有以正确的方式显示,其中一个问题是原始坐标位于窗口小部件的左下角。 我想知道如何使原始坐标位于左上角并翻转y轴。如何使原始坐标(0,0)位于QGLWIdget的左上角?
这里是我的代码:
头
#ifndef _GLImageDisplay_H_
#define _GLImageDisplay_H_
#include "stdafx.h"
class GLImageDisplay : public QGLWidget
{
Q_OBJECT
public:
GLImageDisplay(QWidget *parent = 0);
void DisplayImage(QString img);
protected:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
private:
QImage svgImage;
GLubyte* gluImage;
};
#endif
CPP
#include "stdafx.h"
#include "GLImageDisplay.h"
GLImageDisplay::GLImageDisplay(QWidget *parent) : QGLWidget (parent)
{
}
void GLImageDisplay::DisplayImage(QString img)
{
svgImage.load(img);
resize(svgImage.size());
gluImage = new GLubyte[svgImage.height() * svgImage.width() * 3];
for (int a = 0; a < svgImage.width(); ++a)
{
for (int b = 0; b < svgImage.height(); ++b)
{
QColor color = svgImage.pixel(a, b);
gluImage[3 * (a + b * svgImage.width()) + 0] = (GLubyte) color.red();
gluImage[3 * (a + b * svgImage.width()) + 1] = (GLubyte) color.green();
gluImage[3 * (a + b * svgImage.width()) + 2] = (GLubyte) color.blue();
}
}
this->setMinimumWidth(svgImage.width());
this->setMinimumHeight(svgImage.height());
}
void GLImageDisplay::initializeGL()
{
glClearColor(0.5, 0.5, 0.5, 1.0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}
void GLImageDisplay::resizeGL(int w, int h)
{
glViewport(0, 0, svgImage.width(), svgImage.height());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, svgImage.width(), 0, svgImage.height(), 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void GLImageDisplay::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
glRasterPos2i(0, 0);
glDrawPixels(svgImage.width(), svgImage.height(), GL_RGB, GL_UNSIGNED_BYTE, gluImage);
}
为了解决这个问题,您应该切换到QGraphicsScene和的QGraphicsView设置。当您将目标设置为QGraphicsView到QGLWidget时,您可以使用GL。这里有一些示例代码:http://qt.gitorious.org/qt-labs/modelviewer它非常强大,虽然有点复杂,我不得不承认。否则,当滚动或者渲染到FBO(QGLBuffer)并相应地在滚动区域中显示那个时,您将需要完成整个GL重绘。 – ypnos
请注意,在modelviewer示例中,他们让QGraphicsScene始终是QGraphicsView的大小以避免滚动。相反,您只需将QGraphicsScene尺寸设置为图像/内容的尺寸即可。 – ypnos
我会看看modelviewer。人们建议使用qglwidget将qabstractscrollarea分类,并使用滚动条位置设置视口位置。你认为这会起作用,我仍然试图实施它。 – azer89