1

我是 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 及其子项,有没有更好的方法来做到这一点?

4

1 回答 1

0

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

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(this); //在主窗口构造函数中

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

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

我希望这至少对你们中的一些人有所帮助。享受!

于 2012-12-12T14:08:43.790 回答