我想使用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