Как правильно отобразить 3D-модель поверх QGraphicsView? - PullRequest
0 голосов
/ 19 октября 2011

Я хотел бы отобразить изображение и 3d модель поверх этого изображения.До сих пор я использовал QGraphicsView для отображения QGraphicsScene, где я добавляю изображение как QGraphicsPixmapItem.

. QGraphicsView настроен в:

ImageResourceWidget::ImageResourceWidget(ImageResource* resource, QWidget* parent) :
    QWidget(parent),
//QGraphicsScene m_scene;
//QGraphicsView m_view;
    m_view(&m_scene),
    m_pixmapItem(QPixmap::fromImage(resource->qimage())),
    m_zoom(1.0)
{
    QVBoxLayout* layout = new QVBoxLayout;

    layout->addWidget(&m_view);
    setLayout(layout);

    QGLWidget* qgl=new QGLWidget(new QGLContext(QGLFormat(QGL::Rgba | QGL::DoubleBuffer | QGL::AlphaChannel | QGL::HasOverlay)));
    m_view.setViewport(qgl);

    _updateScene();

    connect(m_resource, SIGNAL(si_updateImage()), SLOT(updateImage()));
}

Я пытаюсь нарисовать поверх QGraphicsView, переопределив paintEvent в ImageResourceWidget:

void ImageResourceWidget::paintEvent(QPaintEvent* event)
{
    std::cout << __PRETTY_FUNCTION__ << " -- paintEvent called." << std::endl;
    QPainter painter(this);
    painter.fillRect(0, 0, 128, 128, Qt::green);

//    from: http://doc.qt.nokia.com/4.7-snapshot/qpainter.html#beginNativePainting
//    painter.beginNativePainting();

//    glEnable(GL_SCISSOR_TEST);
//    glScissor(0, 0, 64, 64);

//    glClearColor(1, 0, 0, 1);
//    glClear(GL_COLOR_BUFFER_BIT);

//    glDisable(GL_SCISSOR_TEST);
//    painter.endNativePainting();

      // For testing purposes:
      QPaintEngine::Type pType = m_view.paintEngine()->type(); // pType = QPaintEngine::X11, was expecting QPaintEngine::OpenGL(2)
      QPainter* p = m_view.paintEngine()->painter();           // p = 0x0, was expecting some other value
}

. Это нарисует зеленый прямоугольник позади QGraphicsView.

Этот веб-сайт предлагает подкласс QGraphicsScene, однако я не хочу, чтобы 3d-модель была частью сцены.Другими словами, 3d-модель не должна подвергаться изменениям в сцене или виде.Он должен просто зависнуть поверх из QGraphicsView.

Я также попытался создать подкласс QGraphicsView (что, мне кажется, является желаемым способом), но когда я переопределяюpaintEvent в этом классе больше ничего не отображается, и я получаю предупреждение: QPainter::begin: Widget painting can only begin as a result of a paintEvent

void MyGraphicsView::paintEvent(QPaintEvent* event) // inherits QGraphicsView
{
    this->QGraphicsView::paintEvent(event);
    std::cout << __PRETTY_FUNCTION__ << " -- paintEvent called." << std::endl;

    QPainter painter(this);
    painter.fillRect(0, 0, 128, 128, Qt::green);

    // For testing purposes:
    QPaintEngine::Type pType = paintEngine()->type(); // pType = QPaintEngine::X11, was expecting QPaintEngine::OpenGL(2)
    QPainter* p = paintEngine()->painter();           // p = 0x0, was expecting some other value
}

ОБНОВЛЕНИЕ :

  • Я заметил, чтоpaintEngine()->type() возвращает QPaintEngine::X11, ожидал QPaintEngine::OpenGL после m_view.setViewport(new QGlWidget(...)).
  • paintEngine()->painter() возвращает 0x0, я надеялся получить доступ к художнику, чтобы я мог рисовать на той же поверхности.

1 Ответ

0 голосов
/ 19 октября 2011

Возможно, вы хотите рисовать в окне просмотра, а не непосредственно в QGraphicsView. Я предполагаю, что область просмотра - это то, что содержит фактическое представление сцены. В любом случае я не могу понять, почему вы получаете ошибку события рисования.

...