Qt--QGraphicsView:在视口外绘制
我创建了一个名为MFDView的自定义QtGraphicsView类。我们的想法是: (1) 绘制在整个MFDView上的单个图像 (2) 位于MFDView外围的多个QPUSH按钮(这些按钮将显示在背景图像的顶部);及 (3) 关联的Qgraphicscene显示在视图的中心,即周围QPushButtons的外围(场景也将显示在背景图像的顶部) 在MFDView构造函数中,我调用setViewportMargins()将场景限制在MFDView的有限中心区域,并在MFDView上为外围按钮创建空间 我覆盖paintEvent(QPaintEvent*事件)以将图像绘制到MFDView上 以下是相关代码:Qt--QGraphicsView:在视口外绘制,qt,qgraphicsview,Qt,Qgraphicsview,我创建了一个名为MFDView的自定义QtGraphicsView类。我们的想法是: (1) 绘制在整个MFDView上的单个图像 (2) 位于MFDView外围的多个QPUSH按钮(这些按钮将显示在背景图像的顶部);及 (3) 关联的Qgraphicscene显示在视图的中心,即周围QPushButtons的外围(场景也将显示在背景图像的顶部) 在MFDView构造函数中,我调用setViewportMargins()将场景限制在MFDView的有限中心区域,并在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)中有何用途
提前谢谢