使用子项缩放QGraphicsItem的一部分

时间:2012-12-10 13:45:28

标签: zooming

我是Qt的新手并且遇到了问题。我有一个QGraphicsPixmap项目,其中包含很少的子项(矩形和椭圆),随后有一些子项。现在我想展示Graphicspixmap项目的一部分,其中所有子项都在鼠标悬停事件的QLabel上放大。 所以我所做的如下:

GraphicsPixmapItem::GraphicsPixmapItem(QPixmap pixmap):QGraphicsPixmapItem(pixmap)
{
setAcceptsHoverEvents(true);
}

void GraphicsPixmapItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
{
QPointF p = event->pos();
QRect rect(p.x(), p.y(), 100, 100);
lb->setPixmap(pixmap().copy(rect).scaled(lb->width(),lb->height()));
lb->repaint();
QApplication::processEvents();
}

void GraphicsPixmapItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
lb=new QLabel();
lb->resize(400,400);
lb->show();
}

void GraphicsPixmapItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
lb->close();
}

这是完美缩放Graphicspixmap但不是子项目。我的问题是如何在QLabel中显示带有子项的Graphicspixmap,有没有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

我已经找到了我自己的解决方案,并想到分享这个问题,以便任何面临同样问题的人都能在这个问题上节省时间。 我已经用两种方式完成了它。首先,我使用鼠标悬停事件在之前工作的同一行解决了它,如下所示:

void GraphicsPixmapItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
imageviewLabel=new QLabel();
imageviewLabel->setAlignment(Qt::AlignCenter);
imageviewLabel->setGeometry(QApplication::desktop()->width()/2, 50, 600, 600);
imageviewLabel->show();
}

void GraphicsPixmapItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
{
QRect viewrect(event->pos().x(), event->pos().y(), 100, 100);
imageviewLabel->setPixmap(QPixmap::grabWidget(QApplication::mainWidget(),viewrect).scaled(imageviewLabel->width(),imageviewLabel->height()));
imageviewLabel->repaint();
QApplication::processEvents();
}

void GraphicsPixmapItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
imageviewLabel->close();
}

要使此代码适合您,只需将主窗口设置为我使用标志设置的主窗口小部件: 的QApplication :: setMainWidget(本); //在Mainwindow构造函数中

然后我找到了一个更好的解决方案,可以显着减少代码和复杂性。这是通过实现wheelMove事件:

void GraphicsPixmapItem::wheelEvent(QGraphicsSceneWheelEvent *event)
{
prepareGeometryChange();
setScale(scale()*exp(-event->delta() / 600.0));
}

我希望这对至少有些人有帮助。请享用!