如何使用QT显示图像的一部分

How to show part of an image using QT?

本文关键字:图像 一部分 显示图 显示 何使用 QT      更新时间:2023-10-16

所以,这是我的问题:我有一个非常大的图像,我想只显示它的特定部分。在用户按下特定的键后,我希望图像移动,显示它的另一部分。从图像的一部分到另一部分的过渡必须是平滑的,动画的。

我尝试使用QLabel来显示图像,但它总是显示图像的中心,我真的不知道如何制作动画。你们有什么建议?

有趣的问题。这是我刚刚测试过的一些东西,似乎有效。

添加一个QGraphicsView,尺寸为您想要显示的图像部分的尺寸,例如100x100。创建一个QGraphicsScene并将其添加到视图:

QGraphicsScene* pScene = new QGraphicsScene(this);
ui->graphicsView->setScene(pScene);

现在将图像添加到场景中。在我的例子中,我的资源文件中有一个图像。诀窍是将sceneRect设置为您想要显示的位置。我想显示图像的100x100部分,从0,300开始:

pItem = pScene->addPixmap(QPixmap::fromImage(QImage(":/photos/image")));
pScene->setSceneRect(0,300,100,100);

为了测试平滑移动,我添加了一个按钮,当点击时触发一个称为移动的插槽。这个槽只更新sceneRect。在我的简单示例中,我只是将图像向右移动100像素。在现实场景中,您还可以将其沿对角线或垂直方向移动,并检查图像限制。

void move()
{
    for (unsigned i=currentX; i<currentX + 100; i++)
    {
    ui->graphicsView->scene()->setSceneRect(i,300,100,100);
    qApp->processEvents();
    }
    currentX += 100;
}

注意currentX变量。它只不过是最后一个图像位置。此外,我们必须调用processEvents,以便"看到"图像平滑地移动。

您可以使用QPixmap::copy(int x, int y, int width, int height)来复制图像的一个区域并显示该区域

几个选项:

  1. 尝试使用Q3CanvasSprite(在Q3Canvas)。它的设计更多的是为了将一个图像分割成多个图像,而不是为了在它们之间进行动画。你可以尝试滥用它,并声明(比如)100帧(每个数字10帧,这将用作动画步骤),或者直接使用move()方法。
  2. 尝试QGraphicsPixmapItem::setOffset()(在QGraphicsScene内)。这可能是过度的,因为QGraphicsScene是为大量图像制作的)。

我不确定,但也许这可以用QStateMachineQAbstractAnimation来完成。