Увеличение / уменьшение изображений - QT c ++ - PullRequest
1 голос
/ 15 февраля 2020

В настоящее время я использую QT для загрузки изображений в сцену с графическим изображением. По сути, я ищу способ увеличения и уменьшения загруженного изображения с помощью ползунка. Изображение успешно загружается в панель, но все, что я пытаюсь реализовать для увеличения / уменьшения, изображение исчезнет.

Вот как это выглядит:

GraphicsView

Это моя реализованная функция, но изображение исчезает:

    void MainWindow::on_horizontalSlider_valueChanged(int value)
{
    float pool ;
        if(value==0 )
            pool=0.1;
        else
            pool  = value*0.01;

        scene->update();
        ui->graphicsView->transform();
        ui->graphicsView->scale(pool,pool);

}

Вот как Я загружаю изображения:

    void MainWindow::on_BrowseImages_clicked()
{
    QString imagePath = QFileDialog::getOpenFileName(
                this,
                tr("Open File"),
                "",
                tr("Images (*.jpg *.jpeg *.png)" )
                );

    imageObject = new QImage();
    imageObject->load(imagePath);

    image = QPixmap::fromImage(*imageObject);

    scene = new QGraphicsScene(this);
    scene->addPixmap(image);
    scene->setSceneRect(image.rect());
    ui->graphicsView->setScene(scene);
    //ui->graphicsView->fitInView(scene->sceneRect(),Qt::KeepAspectRatio);

}

1 Ответ

0 голосов
/ 18 февраля 2020

Когда к преобразованию применяется масштабирование, оно всегда масштабируется вокруг начала координат.

Масштабирование с определенным центром (не источником) означает, что центр был переведен в начало координат до масштабирования.

Это может быть

v ' = translate O → C ( scale () перевод C → O ( v )))

или с матричными операциями

v ' = M перевод O → CM масштаб M перевод C → O v

Однако Grahics View Framework предоставляет что-то, где объединение преобразований фактически встроено по умолчанию:

  • Каждый элемент обеспечивает свое собственное локальное преобразование.
  • Преобразование группового элемента применяется к дочерним элементам, а также формирует что-то, что можно представить локальная система координат.

Имея это в виду, я придумал следующий MCVE, в котором - перемещение к центру применяется к элементу растрового изображения - масштабирование применяется к элементу группы, который становится родительским для растрового изображения item.

testQGraphicsViewScaleItem.cc:

// Qt header:
#include <QtWidgets>

// main application
int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup data
  QGraphicsScene qGScene;
  QGraphicsItemGroup qGItemGrp;
  QImage qImgCat("cat.jpg");
  QGraphicsPixmapItem qGItemImg(QPixmap::fromImage(qImgCat));
  qGItemImg.setTransform(
    QTransform().translate(-0.5 * qImgCat.width(), -0.5 * qImgCat.height()));
  qGItemGrp.addToGroup(&qGItemImg);
  qGScene.addItem(&qGItemGrp);
  // setup GUI
  QWidget qWinMain;
  qWinMain.setWindowTitle("QGraphicsView - Scale Image");
  QVBoxLayout qVBox;
  QGraphicsView qGView;
  qGView.setScene(&qGScene);
  qVBox.addWidget(&qGView, 1);
  QSlider qSlider(Qt::Horizontal);
  qSlider.setRange(-100, 100);
  qVBox.addWidget(&qSlider);
  qWinMain.setLayout(&qVBox);
  qWinMain.show();
  // install signal handlers
  auto scaleImg = [&](int value) {
    const double exp = value * 0.01;
    const double scl = pow(10.0, exp);
    qGItemGrp.setTransform(QTransform().scale(scl, scl));
  };
  QObject::connect(&qSlider, &QSlider::valueChanged,
    scaleImg);
  // runtime loop
  return app.exec();
}

и файл проекта qmake testQGraphicsViewScaleItem.pro:

SOURCES = testQGraphicsViewScaleItem.cc

QT += widgets

Вывод:

Snapshot of testQGraphicsViewScaleItem (initial scaling)

Snapshot of testQGraphicsViewScaleItem (0.1 < scaling < 1)

Snapshot of testQGraphicsViewScaleItem (scaling = 0.1)

Snapshot of testQGraphicsViewScaleItem (scaling = 10)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...