Shape не рисует, используя события мыши вне функции paintGL - QT OpenGL C ++ - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть эта функция, которая должна рисовать прямоугольник в зависимости от того, где пользователь щелкает и перетаскивает, однако ничего не рисуется. Я попытался использовать функцию updateGL(), которая возвращает ошибку. Я также пытался использовать QPainter, но я не был уверен, как работать с кодом ниже. Я также пытался использовать makeCurrent() и doneCurrent(), но это делает программу "неожиданно завершенной sh".

функции рисования формы:

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();

}

Также у меня есть это Функция Intializer и, возможно, в этом причина, но когда я пытаюсь запустить context->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();
}

1 Ответ

0 голосов
/ 16 апреля 2020

Для выполнения инструкции OpenGL необходим действительный и текущий Контекст OpenGL . QOpenGLWidget предоставляет такой контекст OpenGL, когда выполняются методы обратного вызова события initializeGL(), paintGL() и resizeGL().

Если вы хотите использовать инструкцию en OpenGL в обратном вызове события мыши, вам нужно сделать контекст OpenGL текущим с помощью makeCurrent() и освободить его с помощью doneCurrent():

Например:

void drawingArea::mouseReleaseEvent(QMouseEvent *event)
{
    makeCurrent()

    // [...]

    doneCurrent()
}

Примечание, никогда не вызывайте функцию обратного вызова paintGL напрямую. Используйте update(), чтобы запланировать рисование даже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...