簡體   English   中英

如何立即強制 Qt 在paintGL() 中重新繪制 QOpenglWidget?

[英]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();
}

我有三個問題。

  1. 為什么我必須在paintGL() 中釋放vao 和vbo 來使用QPainter 繪制小部件,如果沒有,Qpainter 不起作用。

  2. 當同時使用 QPainter 和 OpenGL API 時,小部件無法在 paintGL() 中繪制紋理。 只需調用 OpenGL API 即可正常工作。

  3. 當我頻繁重繪小部件(頻繁點擊小部件,調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM