2016-08-26 119 views
1

我正在嘗試對我創建的QOpenGLWidget進行文本/圖形疊加。正如你所看到的,我已經使3D下降得非常緊密,但使用QPainter的2D覆蓋圖工作不正常。使用QPainter的drawRect函數我期望看到一個矩形。相反,我得到四個箭頭。QOpenGLWidget QPainter :: drawRect只繪製四個箭頭

QOpenGLWidget with arrows instead of a rectangle

相關的代碼如下:

的main.cpp

QApplication a(argc, argv); 

QSurfaceFormat format; 
format.setProfile(QSurfaceFormat::OpenGLContextProfile::CompatibilityProfile); 
QSurfaceFormat::setDefaultFormat(format); 

HSIOpenGLQuadViewWidget qvwidget; 
qvwidget.setFormat(format); 
qvwidget.init(); 
qvwidget.addPoint(QVector3D(-1, 1, 1), Qt::red); 
qvwidget.addPoint(QVector3D(1, 1, 1), Qt::red); 
qvwidget.addPoint(QVector3D(1, -1, 1), Qt::red); 
qvwidget.addPoint(QVector3D(-1, -1, 1), Qt::red); 
qvwidget.addPoint(QVector3D(0, 0, 0), Qt::red); 
qvwidget.addPoint(QVector3D(-1, 1, -1), Qt::red); 
qvwidget.addPoint(QVector3D(1, 1, -1), Qt::red); 
qvwidget.addPoint(QVector3D(1, -1, -1), Qt::red); 
qvwidget.addPoint(QVector3D(-1, -1, -1), Qt::red); 
qvwidget.generateSphere(0.5); 
qvwidget.show(); 

return a.exec(); 

MyQOpenGLWidget.cpp

void HSIOpenGLQuadViewWidget::initializeGL() 
{ 
// Required by Qt 
initializeOpenGLFunctions(); 

// Creates a 24 bit depth mask 
glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width(), height()); 

// Sets the OpenGL screen clear color 
glClearColor(0, 0, 0, 0); 

glEnable(GL_POLYGON_SMOOTH); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); 

// Enables face culling 
glEnable(GL_CULL_FACE); 
glCullFace(GL_BACK); 

glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 
glColorMaterial(GL_FRONT, GL_SPECULAR); 

// Somewhere in the initialization part of your program… 
glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 

glShadeModel(GL_SMOOTH); 

// Create light components 
//GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
GLfloat ambientLight[] = { 2.0f, 2.0f, 2.0f, 1.0f }; 
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8f, 1.0f }; 
GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f }; 
GLfloat position[] = { 0.0f, -10.0f, 0.0f, 1.0f }; 

// Assign created components to GL_LIGHT0 
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); 
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); 
glLightfv(GL_LIGHT0, GL_POSITION, position); 

//glDisable(GL_DEPTH_TEST); 
glEnable(GL_PROGRAM_POINT_SIZE); 
glPointSize(5); 
} 

void HSIOpenGLQuadViewWidget::paintGL() 
{ 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

// Set the depth test and clear the depth field 
glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 
glClearDepth(1.0); 
glDepthFunc(GL_LEQUAL); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

drawPoints(); 

drawSphere(); 

glPopMatrix(); 

QPainter painter(this); 

QRect rect = this->rect(); 

float top = rect.y() + (rect.height() * 0.8); 
float height = rect.height() * 0.15; 
float left = rect.x() + (rect.width() * 0.8); 
float width = rect.width() * 0.15; 

QPen pen; 
pen.setColor(Qt::red); 
pen.setWidth(10); 
painter.setPen(pen); 
painter.setBrush(QBrush(Qt::red)); 
painter.drawRect(left, top, width, height); 

QString textYaw = QString(" Yaw : ") + QString::number(100) + QString("\n"); 
QString textPitch = QString("Pitch : ") + QString::number(200) + QString("\n"); 
QString textRoll = QString(" Roll : ") + QString::number(300) + QString("\n"); 

painter.drawText(left, top + 10, textYaw); 
painter.drawText(left, top + 25, textPitch); 
painter.drawText(left, top + 40, textRoll); 
} 

所以,問題是,什麼是導致QOpenGLWidget繪製四個箭頭而不是一個實體d矩形?任何人都有線索?謝謝。

回答

1

參見this answer。你需要首先啓動一個畫家,然後通知它有關本地繪畫,推動國家,使用GL調用本地繪畫,彈出狀態,結束本地繪畫,並最終使用畫家繪畫。

+0

我試過兩種方法。有或沒有開始/ endNativePainter()我得到相同的結果。 – soulsabr

+1

您的上下文預初始化正在破壞它。查看其他答案的詳細信息和評論。以零碎的方式來做:先做一些非常簡單的工作 - 例如根本沒有OpenGL的調用,只是畫家,然後開始逐個添加簡單的繪製調用,看看它打破了什麼地方。這顯然不起作用,因爲這位畫家所期望的背景不同於它所處的那個背景。 –

+0

kuba ober我會爲此拍攝一張照片。真的不敢相信我甚至沒有想過這樣做。 :)即使它不起作用,它仍然是一個愚蠢的菜鳥錯誤。 – soulsabr