Я хотел бы отобразить изображение и 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
, я надеялся получить доступ к художнику, чтобы я мог рисовать на той же поверхности.