[英]How to force Qt repaint QOpenglWidget in paintGL() immediately?
我想在 QOpenGLWidget 中繪圖,處理數據並在 mousePressEvent() function 中調用 repaint():
QPoint point[2];
QImage img=QImage(1000,800,QImage::Format_Grayscale8);
void Widget::mousePressEvent(QMouseEvent *event)
{
point[0]=event->pos();
point[1]=point[0]+QPoint(10,10);
repaint();
}
現在在paintGL() 中重繪小部件:
void Widget::paintGL()
{
vao->release();
vbo->release();
QPainter painter;
painter.begin(image);
painter.drawLine(point[0],point[1]);
painter.end();
painter.begin(this);
painter.drawImage(0,0,*del->tmpImages[1]);
painter.beginNativePainting();
vao->bind();
vbo->bind();
glViewport(0,0,200,200);
glDrawArrays(GL_TRIANGLE_STRIP,0,8);
painter.endNativePainting();
painter.end();
}
我有三個問題。
為什么我必須在paintGL() 中釋放vao 和vbo 來使用QPainter 繪制小部件,如果沒有,Qpainter 不起作用。
當同時使用 QPainter 和 OpenGL API 時,小部件無法在 paintGL() 中繪制紋理。 只需調用 OpenGL API 即可正常工作。
當我頻繁重繪小部件(頻繁點擊小部件,調用mousePressEvent()和repaint())時,Qt會忽略一些重繪事件。如果調用repaint(),QWidget會立即重繪,那么我該如何強制Qt像重繪QOpenGLWidget一樣調用 repaint() 來重繪 QWidget?
最后,我將 Qpainter 放在 mouseMove() function 中以在 QImage 上繪圖。 然后當我開始在圖像上繪制時,mouseMove() 將立即在圖像上繪制,每個動作都會得到響應,然后在小部件上繪制圖像,qt 將不再忽略繪制動作。 問題得到解決。 但我仍然沒有得到問題二和三的答案。
你調用了initializeOpenGLFunctions()嗎? 並且您可能需要重新實現 QOpenGLWidget::paintEvent 並調用 update()?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.