Масштабирование элементов QGraphicsItem

522
03 мая 2017, 11:35

Пытаюсь создать графический редактор на Qt. Добавил на сцену графические элементы QGraphicsItem на сцену QGraphicsScene. Нужно сделать функцию масштабирования этих элементов. На форме создал меню с действиями, по щелчку на которые должно совершаться масштабирование. Прикреплен код функции класса сцены, который именно и описывает, как я пытаюсь осуществить масштабирование.

void PaintScene::scaleObject(const qreal Scala){
foreach (QGraphicsItem *item, selectedItems()){
    QTransform itTransf = item->transform();
    QPointF dp = item->boundingRect().center();
    itTransf.translate( dp.x(), dp.y());
    itTransf *= QTransform::fromScale(Scala, Scala);
    itTransf.translate( -dp.x(),  -dp.y());
    item->setTransform(itTransf);
    item->update();}
 }

Проблема в том, что используя приведенный код, у меня масштаб элементов вроде как изменяется, но они при этом съезжают. Видимо, проблема с координатами, т. е. как будто бы изменяется масштаб сцены. Не могу разобраться в чем дело. Подскажите, пожалуйста, что можно сделать. Заранее спасибо за советы.

Answer 1

Попробуйте добавить флаг QGraphicsItem::ItemIgnoresTransformations для item

#ifndef MAINWIN_H
#define MAINWIN_H
#include <QtWidgets/QMainWindow>
#include <QGraphicsView>
#include <QPushButton>
#include <QGraphicsObject>
#include <QGradient>
#include <QPen>
class Rect : public QGraphicsObject
{
    Q_OBJECT
    Q_PROPERTY(QPointF position READ pos WRITE setPos)
public:
    Rect() : m_draw_rect(QRectF())
    {
    }
    void set_draw_rect(const QRectF& _draw_rect)
    {
        m_draw_rect = _draw_rect;
    }
    QRectF boundingRect() const override
    {
        //origin at 0,0 top left
        return m_draw_rect;
    }
    void paint(QPainter *_painter, const QStyleOptionGraphicsItem *_option, QWidget *_widget = Q_NULLPTR) override
    {
        _painter->setPen(QPen(Qt::red));
        _painter->drawRoundRect(boundingRect(), 0, 0);
    }
protected:
    QRectF m_draw_rect;
};
class mainwin : public QMainWindow
{
    Q_OBJECT
public:
    mainwin(QWidget *parent = 0)
    {
        QGraphicsScene* scene = new QGraphicsScene();
        for (int j = 0; j < 4; ++j)
        {
            for (int i = 0; i < 4; ++i)
            {
                Rect* rect = new Rect();
                rect->set_draw_rect(QRect(0, 0, 30, 30));
                rect->setPos(QPoint(i * 100, j * 100));
                rect->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIgnoresTransformations);
                if (j==0)
                    rect->setSelected(true);
                scene->addItem(rect);
            }
        }

        QGraphicsView* view_widget = new QGraphicsView();
        view_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
        view_widget->setScene(scene);
        setCentralWidget(view_widget);
        setFixedSize(640, 480);
        QPushButton* btn = new QPushButton("Scale", this);
        QObject::connect(btn, &QPushButton::clicked, this, [scene]
        {
            qreal scale = 1.4;
            foreach(QGraphicsItem *item, scene->selectedItems())
            {
                item->setScale(scale);
                item->update();             
            }
        });
    }
};
#endif // MAINWIN_H
READ ALSO
запись в excel c++

запись в excel c++

Как можно записать данные в файл Excel, сначала создав этот файл? Также можно ли это сделать с помощью функции ofstream?

257
Поломка в Visual Studio 2017

Поломка в Visual Studio 2017

Доброго дняМожет кто-то уже столкнулся

422
Перегрузка оператора вызова ()

Перегрузка оператора вызова ()

подскажите, как перегрузить operator() так, чтобы индексация строк начиналась с отрицательного числа(ну то есть чтобы я мог обращаться, например,...

237
Вывести текст из бинарного &ldquo;01&rdquo; кода

Вывести текст из бинарного “01” кода

Привет всем! Нужно декодировать из двоичной системы, то есть, дан бинарный код и я должен его расшифровать и вывести полученные символы на экран(текст)

249