Когда к преобразованию применяется масштабирование, оно всегда масштабируется вокруг начала координат.
Масштабирование с определенным центром (не источником) означает, что центр был переведен в начало координат до масштабирования.
Это может быть
v ' = translate O → C ( scale () перевод C → O ( v )))
или с матричными операциями
v ' = M перевод O → C • M масштаб • 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
Вывод:



