所以,这是我的问题:我有这个非常大的图像,我想只展示它的一个特定部分。用户按下特定键后,我希望图像移动,显示其中的另一部分。从图像的一部分到另一部分的过渡必须是平滑的,动画的。
我尝试使用QLabel来显示图像,但它总是显示图像的中心,我真的不知道如何制作动画。你们会建议什么?
答案 0 :(得分:4)
有趣的问题。这是我刚刚测试过并且似乎有用的东西。
添加QGraphicsView
尺寸为您要显示的图像部分的尺寸,例如100x100。创建QGraphicsScene
并将其添加到视图中:
QGraphicsScene* pScene = new QGraphicsScene(this);
ui->graphicsView->setScene(pScene);
现在将您的图像添加到场景中。在我的情况下,我的资源文件中有一个图像。诀窍是将sceneRect
设置为您想要显示的位置。我想从0,300开始显示100x100的图像部分:
pItem = pScene->addPixmap(QPixmap::fromImage(QImage(":/photos/image")));
pScene->setSceneRect(0,300,100,100);
为了测试平稳移动,我添加了一个按钮,当点击它时会触发一个名为move的插槽。此广告位只会更新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
以“看到”图像平滑移动。
答案 1 :(得分:1)
您可以使用QPixmap :: copy(int x,int y,int width,int height)复制图像的某个区域并显示该区域。
答案 2 :(得分:0)
几个选项:
Q3CanvasSprite
(在Q3Canvas
内)。它的设计更多的是将一个图像分成多个图像,而不是用于它们之间的动画。您可以尝试滥用它并声明(比方说)100帧(每个数字10个,这将用作动画步骤)或只使用move()
方法。QGraphicsPixmapItem::setOffset()
(QGraphicsScene
内)。这可能是过度的,因为QGraphicsScene是为大量图像制作的。)答案 3 :(得分:0)
我不确定,但也许这可以通过QStateMachine
和QAbstractAnimation
完成。