Пытаюсь создать графический редактор на 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();}
}
Проблема в том, что используя приведенный код, у меня масштаб элементов вроде как изменяется, но они при этом съезжают. Видимо, проблема с координатами, т. е. как будто бы изменяется масштаб сцены. Не могу разобраться в чем дело. Подскажите, пожалуйста, что можно сделать. Заранее спасибо за советы.
Попробуйте добавить флаг 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
Как можно записать данные в файл Excel, сначала создав этот файл? Также можно ли это сделать с помощью функции ofstream?
подскажите, как перегрузить operator() так, чтобы индексация строк начиналась с отрицательного числа(ну то есть чтобы я мог обращаться, например,...
Привет всем! Нужно декодировать из двоичной системы, то есть, дан бинарный код и я должен его расшифровать и вывести полученные символы на экран(текст)