Qt--QGraphicsView:在视口外绘制

Qt--QGraphicsView:在视口外绘制,qt,qgraphicsview,Qt,Qgraphicsview,我创建了一个名为MFDView的自定义QtGraphicsView类。我们的想法是: (1) 绘制在整个MFDView上的单个图像 (2) 位于MFDView外围的多个QPUSH按钮(这些按钮将显示在背景图像的顶部);及 (3) 关联的Qgraphicscene显示在视图的中心,即周围QPushButtons的外围(场景也将显示在背景图像的顶部) 在MFDView构造函数中,我调用setViewportMargins()将场景限制在MFDView的有限中心区域,并在MFDView上为外围按钮创建

我创建了一个名为MFDView的自定义QtGraphicsView类。我们的想法是:

(1) 绘制在整个MFDView上的单个图像

(2) 位于MFDView外围的多个QPUSH按钮(这些按钮将显示在背景图像的顶部);及

(3) 关联的Qgraphicscene显示在视图的中心,即周围QPushButtons的外围(场景也将显示在背景图像的顶部)

在MFDView构造函数中,我调用setViewportMargins()将场景限制在MFDView的有限中心区域,并在MFDView上为外围按钮创建空间

我覆盖paintEvent(QPaintEvent*事件)以将图像绘制到MFDView上

以下是相关代码:

MFDView::MFDView(QWidget *parent) : QGraphicsView(parent), m_pMFDImg(0)
{
    createButtons(); //Creates and places peripheral QPushButtons

    QString str("D:\\blahblahblah\\image.png");
    m_pMFDImg = new QImage(str, "png");
    assert(m_pMFDImg->valid(20, 20));
    
    QGraphicsScene *pScene = new QGraphicsScene(rect(), this);
    assert(pScene);
    setScene(pScene);

    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    setViewportMargins(150, 150, 150, 150);
}

void MFDView::paintEvent(QPaintEvent *event)
{
   //QGraphicsView::paintEvent(event); //Tried this for debugging purposes.  No luck.

    QRect r = event->rect(); //For debugging

    QPainter painter(this);
    painter.drawImage(rect().topLeft(), *m_pMFDImg);

    //QGraphicsView::paintEvent(event); //Tried this for debugging purposes.  No luck.
}
运行时,外围QPUSH按钮和中央QGRAPHICSCENE按预期显示。但是,背景图像根本不显示。在paintEvent()中,我看到event->rect()返回一个带有视口尺寸的rect。而且,由于前面调用了setViewportMargins(),因此rect比MFDView::rect()小。显然,paintEvent()中的绘画被剪裁到视口矩形

我也尝试过覆盖牵引地面(QPainter*,const QRect)处理程序,但其绘图区域似乎也被约束到视口(或者更准确地说,约束到Qgraphicscene)

归根结底,我需要一种在MFDView视口外绘制的方法。如果paintEvent()处理程序仅限于在视口中绘制,也就是说,仅限于在QGGraphicscene占用的区域上绘制,那么该处理程序在任何QBStractScrollArea派生类(如QGraphicsView)中有何用途

提前谢谢