【问题标题】:Shape not drawing using mouse events outside of paintGL function - QT OpenGL C++不使用paintGL函数之外的鼠标事件绘制形状 - QT OpenGL C++
【发布时间】:2020-04-16 17:52:58
【问题描述】:

我有这个函数,它应该根据用户点击和拖动的位置绘制一个矩形,但是没有绘制任何内容。我曾尝试使用 updateGL() 函数,但它返回错误。我也尝试过使用 QPainter,但我不确定如何使用下面的代码。我也尝试过使用makeCurrent()doneCurrent(),但这会使程序“意外完成”。

形状绘制函数:

void drawingArea::paintEvent(QPaintEvent *event)
{
    paintGL();
}

void drawingArea::mousePressEvent(QMouseEvent *event)
{
    Shape newShape;
    int x = event->x(),y = event->y();
    shapes.push_back(newShape);
    Point newPoint(x,y);
    shapes[0].addPoint(newPoint);
}

void drawingArea::mouseReleaseEvent(QMouseEvent *event)
{
    QVector<int> startPoint = shapes[0].points[0].getPoint();
    int vertices[]
    {
        event->x(),event->y(),0,
        event->x(),startPoint[1],0,
        event->x(),event->y(),0,
        startPoint[0],event->y(),0
    };
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3,GL_INT,0,vertices);
    glDrawArrays(GL_QUADS,0,4);
    QPainter painter(this);
    glDisableClientState(GL_VERTEX_ARRAY);
    update();

}

我也确实有这个初始化函数,也许是这个原因,但是当我尝试运行 context-&gt;makeCurrent() 时它会抛出一个错误,所以我已经将它注释掉了,但我会删除该函数以防万一

drawingArea::drawingArea(QWidget *parent) : QOpenGLWidget(parent)
{
    //initializeGL();
    //paintGL();
    QSurfaceFormat format;
    format.setProfile(QSurfaceFormat::CompatibilityProfile);
    format.setVersion(2,1);
    setFormat(format);

    context = new QOpenGLContext;
    context->setFormat(format);
    context->create();
    //context->makeCurrent(this->);
    openGLFunctions = context->functions();
}

【问题讨论】:

    标签: c++ qt opengl


    【解决方案1】:

    要执行 OpenGL 指令,需要一个有效且当前的 OpenGL ContextQOpenGLWidget 提供了这样一个 OpenGL 上下文,当事件回调方法 initializeGL()paintGL()resizeGL() 重新执行时。

    如果您想在鼠标事件回调中使用 OpenGL 指令,那么您必须通过 makeCurrent() 将 OpenGL 上下文设为当前并通过 doneCurrent() 释放它:

    例如:

    void drawingArea::mouseReleaseEvent(QMouseEvent *event)
    {
        makeCurrent()
    
        // [...]
    
        doneCurrent()
    }
    

    旁注,切勿直接调用paintGL 回调函数。使用update() 来安排一次绘制。

    【讨论】:

    • 我已经尝试过了,但程序崩溃了,我得到“程序意外完成。进程被强行结束。
    • @TavianT 抱歉,我只能解释你必须做什么,但我无法调试你的代码。
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多