Как показать часть изображения с помощью QT? - PullRequest
5 голосов
/ 16 ноября 2011

Итак, это моя проблема: у меня есть очень большое изображение, и я хочу показать только определенную его часть. После того, как пользователь нажал определенную клавишу, я хочу, чтобы изображение двигалось, показывая другую его часть. Переход от одной части изображения к другой должен быть плавным, анимированным.

Я пытался использовать QLabel, чтобы показать изображение, но оно всегда показывает центр изображения, и я действительно не знаю, как сделать анимацию. Что бы вы предложили, ребята?

Ответы [ 4 ]

4 голосов
/ 16 ноября 2011

Интересный вопрос. Вот то, что я только что проверил и, кажется, работает.

Добавьте 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, чтобы «увидеть», что изображение движется плавно.

1 голос
/ 17 ноября 2011

Вы можете использовать QPixmap :: copy (int x, int y, int width, int height), чтобы скопировать область изображения и отобразить это.

0 голосов
/ 17 ноября 2011

Я не уверен, но, возможно, это можно сделать с помощью QStateMachine и QAbstractAnimation.

0 голосов
/ 16 ноября 2011

Несколько вариантов:

  1. Попробуйте использовать Q3CanvasSprite (в пределах Q3Canvas).Он предназначен больше для разделения одного изображения на несколько, но не для анимации между ними.Вы можете попытаться использовать его и объявить (скажем) 100 кадров (10 на цифру, которые будут использоваться в качестве шагов анимации) или просто использовать метод move().
  2. Попробуйте QGraphicsPixmapItem::setOffset()(в пределах QGraphicsScene).Это может быть излишним, так как QGraphicsScene создан для большого количества изображений).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...