Как изменить масштаб GraphicItems, не нарушая форму? - PullRequest
0 голосов
/ 12 июня 2019

Как перемасштабировать GraphicItems, не нарушая форму?

Я пытаюсь перемасштабировать QGraphicsItems из части сцены.Когда я масштабирую QGraphicsItem, он преобразует форму.

QList<QGraphicsItem*> items;

    for (auto it : items)
    {
        qreal scale = 1.75;

        QPointF c = it->mapToScene(it->boundingRect().center());
        it->setScale(scale);
        QPointF cNew = it->mapToScene((it->boundingRect()).center());
        QPointF offset = c - cNew;
        it->moveBy(offset.x(), offset.y());

    }

Actual Image

Rescaled Image

1 Ответ

0 голосов
/ 12 июня 2019

Создайте QGraphicsItemGroup, содержащий все ваши предметы, и примените к нему преобразование.

Вам просто нужно перецентрировать группу в соответствии с предыдущей позицией.

QList<QGraphicsItem*> makeItems()
{
    return QList<QGraphicsItem*>() << new QGraphicsLineItem(0, 0, 50, 0)
                  << new QGraphicsLineItem(50, 0, 50, 50)
                  << new QGraphicsLineItem(50, 50, 0, 50)
             << new QGraphicsLineItem(0, 50, 0, 0)
                << new QGraphicsRectItem(24, 24, 2, 2)
             << new QGraphicsEllipseItem(0, 0, 50, 50);
}

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);


    QGraphicsScene* scene = new QGraphicsScene(-500, -500, 1000, 1000);
    auto* view = new QGraphicsView;
    view->setScene(scene);


    QList<QGraphicsItem*> items, originalItems;
    originalItems = makeItems();
    items = makeItems();

    QGraphicsItemGroup* itemGroup = new QGraphicsItemGroup;

    for (auto* item: originalItems)
    {
        scene->addItem(item);
    }

    for (auto* item: items)
    {
        itemGroup->addToGroup(item);
    }

    scene->addItem(itemGroup);


    qreal scale = 1.75;
    QPointF const beforeScale = itemGroup->mapToScene(itemGroup->boundingRect().center());
    itemGroup->setScale(scale);
    QPointF const afterScale = itemGroup->mapToScene(itemGroup->boundingRect().center());
    QPointF const offset = beforeScale - afterScale;
    itemGroup->moveBy(offset.x(), offset.y()); // The center will be the same than before the scaling
    view->show();
    return app.exec();
}

Используйте QPen::setCosmetic, чтобы сохранить внешний вид до и после преобразования

...