如何在不干扰图形的情况下重新缩放GraphicItems?

时间:2019-06-12 14:24:49

标签: c++ qt qgraphicsitem

如何在不影响形状的情况下重新缩放GraphicItem?

我正在尝试从场景的一部分重新缩放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 :(得分:0)

创建包含所有项目的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保持转换前后的外观