Russian Qt Forum
Апрель 20, 2024, 01:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как увеличить размеры QGraphicsItem?  (Прочитано 2232 раз)
Lenidoxll
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« : Март 18, 2021, 16:51 »

Добрый день!
Пытаюсь через QGraphicsView нарисовать картинку, однако она получается слишком маленькой. Пробовал через setScale, но никаких результатов это не дает (возможно, потому что я на самих виджетах использовал scale для подгона размеров самих айтемов относительно друг друга). Дальше, я знаю крайние координаты, то есть грубо говоря поле прорисовки, однако их использование (через setMimimumSize и setSceneRect) ни к чему не приводят. Пытался искусственно задать, так сказать, окна прорисовки, размеры виджетов и их расположение через функцию scaling_window(double xmin, double ymin, double xmax, double ymax), но она приводит к ошибке. Пытался "растянуть" картинку на весь QGraphicsView через this->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio); но это также ни к чему не привело.
Подскажите, как можно попробовать решить возникшую проблему?

Код рисования картинки:
mechanism_1.cpp:
Код:
#include "mechanism_1.h"
#include "parts.h"
 
#include <QtMath>
#include <QTimer>
#include <QDebug>
 
Mechanism_1::Mechanism_1(QFont _font, double l1, double l2,
                         double _xa, double _ya, double _xb, double _yb, double _xl, double _yl,
                         double _xc, double _yc, double _xc2, double _yc2,
                         double fi1, double fi2, double al,
                         double _xmin, double _ymin, double _xmax, double _ymax, double _xo1, double _yo1,
                         QWidget *parent) : QGraphicsView(parent)
{
    scene = new Scene();
    this->setScene(scene);
    this->resize(600, 100);
    this->setMinimumSize(600, 100);
 
    this->setRenderHint(QPainter::Antialiasing);    // Устанавливаем сглаживание
    this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Отключаем скроллбар по вертикали
    this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Отключаем скроллбар по горизонтали
    //rscene->setSceneRect(0, 0, 100, 100);   // Устанавливаем размеры графической сцены
    //QRect rect(150, 150, 300, 300);
    this->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
    setAlignment(Qt::AlignCenter);
 
//    QRect mainrect(0, 0, 500, 500);
//    //scene->addRect(rect);
//    scene->addRect(mainrect);
    //scaling_window(_xmin, _ymin, _xmax, _ymax);
 
    fi1g = -fi1;
    fi2g = -fi2;
    alg = -al;
 
    xo1 = _xo1;
    yo1 = -_yo1;
    xa = _xa;
    ya = -_ya;
    xb = _xb;
    yb = -_yb;
    xl = _xl;
    yl = -_yl;
    xc = _xc;
    yc = -_yc;
 
    xmin = _xmin;
    ymin = _ymin;
    xmax = _xmax;
    ymax = _ymax;
 
    scale = 1;
 
    Ox = new Arrow(30);
    scene->addItem(Ox);
 
    textX = new Text(_font, QString("x"));
    textX->setPos(xo1 + Ox->getl() - 3 * 0.5 * scale * textX->getHorizontalAdvance(), yo1 + 2 * scale * textX->getHeight());
    textX->setScale(3*scale);
    scene->addItem(textX);
 
    Oy = new Arrow(30);
    Oy->setRotation(-90);
    scene->addItem(Oy);
 
    textY = new Text(_font, QString("y"));
    textY->setPos(xo1 - 6 * scale * textY->getHorizontalAdvance(), yo1 - Oy->getl() + 3 * 0.5 * scale * textY->getHeight());
    textY->setScale(3*scale);
    scene->addItem(textY);
 
    O1 = new Hinge();
    O1->setPos(xo1, yo1);
    O1->setScale(scale);
    scene->addItem(O1);
 
    O1A = new Crank(l1);
    O1A->setPos(xo1, yo1);
    O1A->setRotation(fi1g);
    scene->addItem(O1A);
 
    A = new FixedHinge();
    A->setPos(xa, ya);
    A->setScale(scale);
    scene->addItem(A);
 
 
    B = new Slider();
    B->setPos(xb, yb);
    B->setRotation(alg);
    B->setScale(scale);
    scene->addItem(B);
 
    L = new FixedHinge();
    L->setPos(xl, yl);
    L->setScale(scale);
    scene->addItem(L);
 
    l = new DoshLine(300);
    l->setPos(xl, yl);
    l->setRotation(alg);
    l->setScale(scale);
    scene->addItem(l);
 
    ABC = new Polygon(_xc2, _yc2, l2);
    ABC->setPos(xa, ya);
    ABC->setRotation(fi2g);
    scene->addItem(ABC);
 
    AB = new Crank(l2);
    AB->setPos(xa, ya);
    AB->setRotation(fi2g);
    scene->addItem(AB);
    AB->hide();
 
    textO1 = new Text(_font, QString("O1"));
    textO1->setPos(xo1 - 3 * scale * textO1->getHorizontalAdvance(), yo1 + 3 * scale * 0.5 * textO1->getHeight());
    textO1->setScale(3*scale);
    scene->addItem(textO1);
 
    textA = new Text(_font, QString("A"));
    textA->setPos(xa - 3 * scale * textA->getHorizontalAdvance(), ya);
    textA->setScale(3*scale);
    scene->addItem(textA);
 
    textB = new Text(_font, QString("B"));
    textB->setPos(xb + 3 * scale * textB->getHorizontalAdvance(), yb);
    textB->setScale(3*scale);
    scene->addItem(textB);
 
    textC = new Text(_font, QString("C"));
    textC->setPos(xc - 3 * scale * textC->getHorizontalAdvance(), yc);
    textC->setScale(3*scale);
    scene->addItem(textC);
 
    textL = new Text(_font, QString("L"));
    textL->setPos(xl + 3 * scale * textL->getHorizontalAdvance(), yl + scale * textL->getHeight());
    textL->setScale(3*scale);
    scene->addItem(textL);
 
//    scene = new Scene();
//    this->setScene(scene);
//    //this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
 
//    if (qAbs(_xmin - _xmax) != 0 and qAbs(_ymin - _ymax) != 0) {
//        this->resize(500,500);
////        this->setMinimumSize(qAbs(_xmin - _xmax), qAbs(_ymin - _ymax));
////        scene->setSceneRect(_xmin, _ymin, qAbs(_xmin - _xmax), - qAbs(_ymin - _ymax));
//        scaling_window(_xmin, _ymin, _xmax, _ymax, width(), height());
////        scene->setSceneRect(_xmin * (1/index), _ymax * (1/index),
////                            qAbs(_xmin - _xmax) * (1/index), qAbs(_ymin - _ymax) * (1/index));
//        scene->setSceneRect(0, 0, width(), -height());
//    } else {
////        this->resize(2*(l1 + l2), 2*(l1 + l2));
////        this->setMinimumSize(2*(l1 + l2), 2*(l1 + l2));
////        scene->setSceneRect(-(l1+l2), -(l1+l2), 2*(l1 + l2), 2*(l1 + l2));
//        scene->setSceneRect(-(l1+l2), -(l1+l2), width(), - height());
//    }
 
//    QRect rect(0, 0, width(), -height());
//    scene->addRect(rect);
 
//    this->setRenderHint(QPainter::Antialiasing);    // Устанавливаем сглаживание
//    this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Отключаем скроллбар по вертикали
//    this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Отключаем скроллбар по горизонтали
 
//    fi1g = -fi1;
//    fi2g = fi2;
//    alg = al;
 
//    xo1 = _xo1 * (1/index);
//    yo1 = -_yo1 * (1/index);
//    xa = _xa * (1/index);
//    ya = -_ya * (1/index);
//    xb = _xb * (1/index);
//    yb = -_yb;
 
//    xmin = _xmin * (1/index);
//    ymin = _ymin * (1/index);
//    xmax = _xmax * (1/index);
//    ymax = _ymax * (1/index);
 
//    O1 = new Hinge();
//    O1->setPos(xo1, yo1);
//    scene->addItem(O1);
 
//    O1A = new Crank(l1*(1/index));
//    O1A->setPos(xo1, yo1);
//    O1A->setRotation(fi1g);
//    scene->addItem(O1A);
 
//    A = new FixedHinge();
//    A->setPos(xa, ya);
//    scene->addItem(A);
 
//    AB = new Crank(l2*(1/index));
//    AB->setPos(xa, ya);
//    AB->setRotation(fi2g);
//    scene->addItem(AB);
 
//    B = new Slider();
//    B->setPos(xb, yb);
//    B->setRotation(al);
    //    scene->addItem(B);
}
 
void Mechanism_1::scaling_window(double xmin, double ymin, double xmax, double ymax)
{
    double relation_x = qAbs(xmin - xmax) / width();
    double relation_y = qAbs(ymin - ymax) / height();
 
    qDebug() << "relation_x = " << relation_x << ", relation_y = " << relation_y << Qt::endl;
    qDebug() << "dx = " << qAbs(xmin - xmax) << ", dy = " << qAbs(ymin - ymax) << Qt::endl;
    qDebug() << "xmin = " << xmin << ", ymin = " << ymin << ", xmax = " << xmax << ", ymax = " << ymax << Qt::endl;
    qDebug() << "height = " << height() << ", width = " << width() << Qt::endl;
 
    if (relation_x > relation_y)
        index = relation_y;
    else
        index = relation_x;
}
parts.cpp:
Код:
#include "parts.h"
 
#include <QFont>
#include <QDebug>
#include <QtMath>
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Hinge~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
Hinge::Hinge() : QGraphicsObject() {}
 
QRectF Hinge::boundingRect() const
{
    return QRectF(-100, -100, 200, 200);
}
 
void Hinge::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
 
    painter->setBrush(Qt::NoBrush);
    painter->setPen(QPen(Qt::black, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    painter->rotate(60.0);
    painter->drawLine(0, 0, 60, 0);
    painter->translate(60, 0);
    painter->rotate(120.0);
    painter->drawLine(0, 0, 60, 0);
    painter->drawLine(-10, 0, 70, 0);
    painter->setPen(Qt::NoPen);
    painter->setBrush(QBrush(Qt::black, Qt::BDiagPattern));
    painter->drawRect(-10, 0, 80, -25);
    painter->setBrush(Qt::NoBrush);
    painter->setPen(QPen(Qt::black, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    painter->translate(60, 0);
    painter->rotate(120.0);
    painter->drawLine(0, 0, 60, 0);
    painter->translate(60, 0);
    painter->rotate(60.0);
    painter->drawEllipse(-40, -40, 80, 80);
    painter->drawEllipse(-25, -25, 50, 50);
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~FixedHinge~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
FixedHinge::FixedHinge()
{
 
}
 
QRectF FixedHinge::boundingRect() const
{
    return QRectF(-250, -250, 500, 500);
}
 
void FixedHinge::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
 
    painter->setBrush(Qt::NoBrush);
    painter->setPen(QPen(Qt::black, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    painter->drawEllipse(-25, -25, 50, 50);
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Slider~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
Slider::Slider() { }
 
QRectF Slider::boundingRect() const
{
    return QRectF(-250, -250, 500, 500);
}
 
void Slider::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
 
    painter->setBrush(Qt::NoBrush);
    painter->setPen(QPen(Qt::black, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    painter->drawRect(-70, -50, 140, 100);
    painter->drawEllipse(-25, -25, 50, 50);
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Crank~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
Crank::Crank(double L) : QGraphicsObject()
{
    l = L;
}
 
QRectF Crank::boundingRect() const
{
    return QRectF(-250, -250, 500, 500);
}
 
void Crank::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
 
    painter->setBrush(Qt::NoBrush);
    painter->setPen(QPen(Qt::black, 4, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    painter->drawLine(0, 0, l, 0);
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Пунктирная прямая~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
DoshLine::DoshLine(double L)
{
    l = L;
    rect = QRectF(-l*0.5, -l*0.5, l, l);
}
 
QRectF DoshLine::boundingRect() const
{
    return rect;
}
 
void DoshLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
 
    painter->setBrush(Qt::NoBrush);
    painter->setPen(QPen(Qt::black, 5, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin));
    painter->drawLine(0, 0, l, 0);
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Стрелка~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
Arrow::Arrow(double L, double Al)
{
    l = L;
    al = Al;
    rect = QRectF(-l*0.5, -l*0.5, l, l);
}
 
QRectF Arrow::boundingRect() const
{
    return rect;
}
 
void Arrow::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
 
    painter->setBrush(Qt::NoBrush);
    painter->setPen(QPen(color, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    painter->drawLine(0, 0, l, 0);
    painter->translate(l, 0);
    painter->rotate(180 - al);
    painter->drawLine(0, 0, l* 0.2, 0);
    painter->rotate(2*al);
    painter->drawLine(0, 0, l* 0.2, 0);
    painter->rotate(180 - al);
    painter->translate(-l, 0);
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Полигон треугольник~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
Polygon::Polygon(double _xc2, double _yc2, double _l2)
{
    xc2 = _xc2;
    yc2 = -_yc2;
    l = _l2;
 
    poly.append(QPoint(0, 0));
    poly.append(QPoint(l, 0));
    poly.append(QPoint(xc2, yc2));
 
 
    if (xc2 * l >= 0)
        (qAbs(xc2) >= qAbs(l)) ? rect = QRectF(0, 0, xc2, yc2) : rect = QRectF(0, 0, l, yc2);
    else
        (xc2 >= 0) ? rect = QRectF(xc2, 0, -(xc2 + qAbs(l)), yc2) : rect = QRectF(xc2, 0, qAbs(xc2) + l, yc2);
}
 
QRectF Polygon::boundingRect() const
{
    return rect;
}
 
void Polygon::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
 
    painter->setBrush(QBrush(Qt::blue, Qt::BDiagPattern));
    painter->setPen(QPen(Qt::red, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    //qDebug() << "Polygon: " << poly << Qt::endl;
 
    painter->drawPolygon(poly);
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Текст~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
Text::Text(QFont Font, QString Str)
{
    font = Font;
    font.setBold(true);
    fm = new QFontMetrics(font);
    str = Str;
}
 
QRectF Text::boundingRect() const
{
    return QRectF(0, 0, fm->horizontalAdvance(str), -fm->height());
}
 
void Text::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
 
    painter->setPen(QPen(Qt::black, fm->height(), Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    painter->setFont(font);
    painter->drawText(0, 0, tr("%1").arg(str));
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Сцена~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
Scene::Scene(QObject *parent) : QGraphicsScene(parent) {}
Scene::~Scene() {}
« Последнее редактирование: Март 18, 2021, 17:03 от Lenidoxll » Записан
Lenidoxll
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #1 : Март 20, 2021, 07:13 »

В итоге решил вопрос следующим образом: во-первых, для каждого создаваемого айтома переопределил boundingRect так, чтобы занимался минимум месте. Во-вторых, создал еще один "псевдоайтем", который совершенно ничего не рисует, но у которого также переопределен boundingRect - он равен всему полю отрисовки сцены и высчитывается в graphicsView, где с помощью метода scene->itemsBoundingRect() можно получать общий размер, занимаемый айтемами, и передавать этот размер в "псевдоайтем".
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 22.