Реализация QGLWidget как видового экрана на Qt 5.12 - PullRequest
0 голосов
/ 24 января 2019

У меня есть полностью работающее приложение, которое использует QGraphicsView + QGLWidget и QGraphicsScene для рисования 3D-сцены с участием пользователя. Концепция объясняется в примере Boxes из Qt5.

После обновления до Qt 5.12 приложение больше не работает. Помимо некоторых других мелких проблем, которые я уже исправил, теперь у меня все настроено, но в окне просмотра ничего не отображается.

Я создал минимальную концептуальную программу, которая создает QGraphicsView, QGLWidget в качестве области просмотра и производный класс QGraphicsScene, который рисует область просмотра.

Я все настроил, но функция QGraphicsScene::DrawBackground() не вызывается.

Интересно то, что приложение хорошо работает в Qt 5.6, но не в 5.12.

Что изменилось между двумя версиями?

Ниже приведен пример приложения:

CMakeLists.txt

cmake_minimum_required(VERSION 3.13)
project(Prototypes)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wall)

find_package(Qt5 REQUIRED COMPONENTS Core Widgets OpenGL)

add_executable(Prototypes main.cpp GraphicsView.cpp GraphicsView.h Scene.cpp Scene.h)

target_link_libraries(Prototypes Qt5::Core Qt5::OpenGL Qt5::Widgets)

main.cpp

#include "GraphicsView.h"
#include "Scene.h"

#include <QApplication>
#include <QGLWidget>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QGLWidget *widget = new QGLWidget(QGLFormat(QGL::SampleBuffers));
    widget->makeCurrent();

    Scene scene(1024,768);

    GraphicsView view;
    view.setViewport(widget);
    view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
    view.setScene(&scene);

    view.resize(800, 600);
    view.show();

    return app.exec();
}

Scene.h

#ifndef PROTOTYPES_SCENE_H
#define PROTOTYPES_SCENE_H

#include <QGraphicsScene>

class QTimer;

class Scene : public QGraphicsScene {
    Q_OBJECT
public:
    Scene(int width, int height);
protected:

    QTimer *m_timer;
    void drawBackground(QPainter *painter, const QRectF &rect) override;

};


#endif //PROTOTYPES_SCENE_H

Scene.cpp

#include "Scene.h"

#include <QPainter>
#include <QDebug>
#include <QTimer>

Scene::Scene(int width, int height)
{
    setSceneRect(0,0,width, height);

    //m_timer = new QTimer(this);
    //m_timer->setInterval(20);
    //connect(m_timer, SIGNAL(timeout()), this, SLOT(update()));
    //m_timer->start();
}

void Scene::drawBackground(QPainter *painter, const QRectF &rect)
{
    qDebug() << "DrawBackground";    
}

GraphicsView.h

#ifndef PROTOTYPES_GRAPHICSVIEW_H
#define PROTOTYPES_GRAPHICSVIEW_H

#include <QGraphicsView>

class GraphicsView : public QGraphicsView {
public:
    GraphicsView();
protected:
    void resizeEvent(QResizeEvent *event) override;

};


#endif //PROTOTYPES_GRAPHICSVIEW_H

GraphicsView.cpp

#include "GraphicsView.h"

#include <QResizeEvent>
#include <QDebug>

void GraphicsView::resizeEvent(QResizeEvent *event)
{
    if (scene()) {
        qDebug() << "Set Scene Rect " << event->size();
        scene()->setSceneRect(QRect(QPoint(0, 0), event->size()));
    }
    QGraphicsView::resizeEvent(event);
}

GraphicsView::GraphicsView()
{
    setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
}

1 Ответ

0 голосов
/ 24 января 2019

Согласно комментарию, QGLWidget был отмечен как устаревший в течение некоторого времени и поставляется с предупреждением ...

Этот класс устарел. Он предназначен для сохранения старого исходного кода. за работой. Мы настоятельно рекомендуем не использовать его в новом коде.

Решением является использование QOpenGLWidget вместо.

...