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

私は自分で解決策を見つけ、それを共有することを考えたので、同じ問題に直面している人は誰でもこの問題で時間を節約できます。私は2つの方法でそれをしました。最初に、以前に作業していたのと同じ行で 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); //Mainwindow コンストラクター内

次に、コード行と複雑さを大幅に削減する、問題のより良い解決策を見つけました。これは wheelMove イベントを実装することによるものです:

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

これが少なくとも一部の人に役立つことを願っています。楽しみ!

于 2012-12-12T14:08:43.790 に答える