Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt Creator and other tools
  4. how to draw an arch correctly via QPainterPath ??
Forum Updated to NodeBB v4.3 + New Features

how to draw an arch correctly via QPainterPath ??

Scheduled Pinned Locked Moved Unsolved Qt Creator and other tools
1 Posts 1 Posters 254 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • timob256T Offline
    timob256T Offline
    timob256
    wrote on last edited by
    #1

    i paint arc (this work )

    QRectF rectangle( _myTexpr.centering_by_x+_myTexpr.strela_length,
    _myTexpr.centering_by_y+_myTexpr.strela_length,
    _myTexpr.centering_by_x+_myTexpr.strela_length,
    _myTexpr.square_equipment);

    int startAngle = 56 * 16;
    int spanAngle =  67 * 16;
    
    painter.drawArc(rectangle, startAngle, spanAngle);
    

    Снимок экрана от 2022-03-16 12-48-37.png

    i paint arc use QPainterPath (this no work )

    Снимок экрана от 2022-03-16 12-51-32.png

    why such a different result, how to get the same result (using QPainterPath) as painter.drawArc ??


    all code:

    cran.h

    #ifndef CRAN_H
    #define CRAN_H
    
    #include <QWidget>
    #include <QDebug>
    #include <QPainter>
    #include <QPen>
    #include <QFont>
    #include <QFontMetrics>
    #include <QKeyEvent>
    #include <QRegion>
    #include <QPointF>
    #include <QGraphicsView>
    #include <QtMath>
    #include <QRectF>
    #include <QPainterPath>
    
    struct texnStructur
    {
        texnStructur() // сразу же заполняем его нулями
        {
            square_equipment_1 = false; square_equipment_2 = false; screen_size_x = 0; screen_size_y = 0;
            indent_x = 0; indent_y = 0; window_height = 0;
            cran_width = 0; cran_height = 0;
            square_equipment = 0; strela_length = 0; font_size_wgt = 0;
            substrate = 0; outline =0; m_pitch = 0;
            centering_by_x = 0; centering_by_y = 0;
            rgb.setRgbF(1.0,1.0,1.0,1.0);
        }
    
        //--
        float indent_x;             // отступ по Х (окно)
        float indent_y;             // отступ по У (окно)
    
        float window_height;        // ширина (окно)
        float cran_width;           //
    
        float cran_height;          // _myTexpr.m_t_razm[5]
        float square_equipment;     // _myTexpr.m_t_razm[7]
        float strela_length;           // _myTexpr.m_t_razm[8]
        float font_size_wgt;        // _myTexpr.m_t_razm[9]
        float font_size_element;    // размер одной элемента
        float size_mask;            // ширина маски (так сказать толщина обводов )
    
        float centering_by_x;   // центрирование по иксу
        float centering_by_y;
    
        bool square_equipment_1;        // переменные для значения подвесов
        bool square_equipment_2;
    
        int screen_size_x;           //размер экрана если он будет отличатся
        int screen_size_y;
    
    
        int  m_pitch;       // переменная для положения на градусной ленте
        // по ГОСТу
         bool substrate;      // фон
         QColor rgb;          // цвет в конце тонеля
    
        bool outline;        // окружение
    };
    
    class Cran : public QWidget
    {
        Q_OBJECT
    
    public:
        Cran(QWidget *parent = nullptr);
        ~Cran();
    
        void size_wgt_cran(int x, int y);
    
        bool get_outline();
        void set_outline(bool set_outline);
    
        bool get_substrate();
        void set_substrate(bool val, QColor me_rgb);
    
    protected:
        void paintEvent(QPaintEvent *event);
     //    void resizeEvent(QResizeEvent *event);
        void keyPressEvent(QKeyEvent *event);
        texnStructur _myTexpr;
    };
    #endif // CRAN_H
    

    main.cpp

    #include "cran.h"
    
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Cran w;
        w.show();
        return a.exec();
    }
    

    wgt_cran.cpp

    #include "cran.h"
    
    Cran::Cran(QWidget *parent)
        : QWidget(parent)
    {
    
    }
    
    Cran::~Cran()
    {
    
    }
    
    void Cran::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);                                     // Создаём объект отрисовщика
    
        QBrush bgfon(QColor(48,172,220),Qt::NoBrush);               // устанавливаем цвет фона и тип заливки (с фоном без фона и тип заливки)
        painter.setRenderHint(QPainter::Antialiasing);              // убираем резкие кубики
    
        QPen pen_osn(Qt::black, 2, Qt::SolidLine, Qt::FlatCap);     // кисть  для основного тела
        QPen pen_bashn(Qt::black, 4, Qt::SolidLine, Qt::FlatCap);   // кисть для башни
    
        painter.setBrush(bgfon);                                    // задаём цвет фона
        painter.setPen(pen_osn);                                    // Устанавливаем кисть для линий и текста
    
        QPainterPath path;                              // ресуем основные элементы
        QPainterPath path2;                             // обводы  элемент обводов
        QPen pen2(Qt::darkGray);                        // обводы  элемент обводов заменить на выборочный цвет
        pen2.setWidthF(_myTexpr.size_mask);             // обводы  размер
    
        painter.setRenderHint(QPainter::Antialiasing);  // убираем резкие кубики
    
        // блок чтоб не пересчитывать если размеры не изменились
        if( _myTexpr.screen_size_x != this->width())
        {
            _myTexpr.screen_size_x = this->width();
            _myTexpr.screen_size_y = this->height();
            size_wgt_cran(this->width(), this->height());
        }
        if(_myTexpr.screen_size_y != this->height())
        {
            _myTexpr.screen_size_x = this->width();
            _myTexpr.screen_size_y = this->height();
            size_wgt_cran(this->width(), this->height());
        }
    
    
        // ---------рисуем фон ------------
        if(_myTexpr.substrate == true)
        {
            qDebug() << "1";
            //            bgfon.setColor(Qt::red);
            painter.setBrush(_myTexpr.rgb);
            painter.drawRect( 0, 0, _myTexpr.screen_size_x, _myTexpr.screen_size_y);                         // рисуем квадрат
        }
        if(_myTexpr.substrate == false)
        {
            qDebug() << "2";
            painter.setBrush(_myTexpr.rgb);
            painter.drawRect( 0, 0, _myTexpr.screen_size_x, _myTexpr.screen_size_y);
        }
    
        // ---------рисуем корпус------------
        // обводы
        if(_myTexpr.outline == true)
        {
            path2.addRect(_myTexpr.centering_by_x+_myTexpr.cran_height/2.1,
                          _myTexpr.centering_by_y+_myTexpr.cran_width/2.1,
                          _myTexpr.cran_width, _myTexpr.cran_height);
            painter.strokePath(path2, pen2);  // обводы  элемент обводов
            painter.drawPath(path2);
        }
    
        path.addRect( _myTexpr.centering_by_x+_myTexpr.cran_height/2.1,
                      _myTexpr.centering_by_y+_myTexpr.cran_width/2.1,
                      _myTexpr.cran_width, _myTexpr.cran_height ) ;
        painter.drawPath(path);
    
        // очищаем эту хрень
        path.clear();
        path2.clear();
    
        // центрирование, поворот, возвращаем центрирование
        painter.translate(this->width()/2.0, this->height()/2.0);
        painter.rotate(_myTexpr.m_pitch);
        painter.translate(-this->width()/2.0, -this->height()/2.0);
        if(_myTexpr.outline == true)
        {
            path2.addRect( _myTexpr.centering_by_x+_myTexpr.cran_height/1.2,
                          _myTexpr.centering_by_y+_myTexpr.cran_width/4.1,
                          _myTexpr.cran_width/5, _myTexpr.cran_height/1.5 ) ;
            painter.strokePath(path2, pen2);  // обводы  элемент обводов
            painter.drawPath(path2);
        }
    
        path.addRect( _myTexpr.centering_by_x+_myTexpr.cran_height/1.2,
                      _myTexpr.centering_by_y+_myTexpr.cran_width/4.1,
                      _myTexpr.cran_width/5, _myTexpr.cran_height/1.5 ) ;
        painter.drawPath(path);
    
        QRectF rectangle( _myTexpr.centering_by_x+_myTexpr.strela_length,
        _myTexpr.centering_by_y+_myTexpr.strela_length,
                         _myTexpr.centering_by_x+_myTexpr.strela_length,
                          _myTexpr.square_equipment);
    
    
        int startAngle = 56 * 16;
        int spanAngle =  67 * 16;
    
    //        if(_myTexpr.outline == true)
    //        {
    //            path2.arcTo(rectangle, startAngle, spanAngle);
    //            painter.strokePath(path2, pen2);  // обводы  элемент обводов
    //            painter.drawPath(path2);
    //        }
    //        painter.drawArc(rectangle, startAngle, spanAngle);
    
        path.moveTo(_myTexpr.centering_by_x+_myTexpr.strela_length,
                     _myTexpr.centering_by_y+_myTexpr.strela_length);
        path.arcTo( rectangle , startAngle, spanAngle);
        painter.drawPath(path);
    
    //    painter.drawArc(rectangle, startAngle, spanAngle);
    
    }
    
    void Cran::keyPressEvent(QKeyEvent *event)
    {
        switch (event->key()) {
    
        case Qt::Key_A: // фон
            if(get_substrate())
            {
                qDebug() << "set_fonn true ";
                QColor  rgb;
                rgb.setRgbF(1.0, 1.0, 1.0, 1.0);
                set_substrate(false, rgb);
            }
            else
            {
                QColor  rgb;
                rgb.setRgbF(1.0, 0.2, 0.6, 1.0);
                set_substrate(true, rgb);
            }
            break;
    
        case Qt::Key_F:
            if(_myTexpr.substrate == true)
                _myTexpr.substrate = false;
            else if(_myTexpr.substrate == false)
                _myTexpr.substrate = true;
            qDebug() << "_myTexpr.square_equipment_1 : " << _myTexpr.square_equipment_1;
            break;
    
        case Qt::Key_T:
            _myTexpr.m_pitch += 1.0;
            if (_myTexpr.m_pitch >= 360)
                _myTexpr.m_pitch = 0;
            break;
    
        case Qt::Key_Y:
            _myTexpr.m_pitch -= 1.0;
            if (_myTexpr.m_pitch == 0)
                _myTexpr.m_pitch = 360;
            break;
    
        case Qt::Key_S: // обводы шрифта
            qDebug() << "_myTexpr.outline Key_S" << _myTexpr.outline;
            if(_myTexpr.outline)
            {
                set_outline(false);
            }
            else
            {
                set_outline(true);
            }
            break;
    
        default:
            QWidget::keyPressEvent(event);
            break;
        }
        update();
    }
    
    bool Cran::get_outline()
    {
        return _myTexpr.outline;
    }
    
    void Cran::set_outline(bool set_outline)
    {
        _myTexpr.outline = set_outline;
        update();
    }
    
    bool Cran::get_substrate()
    {
        return _myTexpr.substrate;
    }
    
    void Cran::set_substrate(bool val, QColor me_rgb)
    {
        _myTexpr.substrate = val;
        _myTexpr.rgb = me_rgb;
        update();
    }
    
    void Cran::size_wgt_cran(int x, int y)
    {
        float side = qMin(width(), height());
    
        _myTexpr.indent_x = x/2.0;                   // начало (отступ по х) х1
        _myTexpr.indent_y = y/4.0;                   // начало (отступ по y) y1
    
        //    _myTexpr.tank_width = y/2.0;               // середина по У
    
        _myTexpr.cran_width = side/2.0;              // ширина танка
        _myTexpr.cran_height = side/1.8;             // высота танка
    
        _myTexpr.square_equipment = side/16.0;       // ширина и высота квадрада эмулир "подвесы"
    
        _myTexpr.strela_length = side/2.0;              // для центрирования
    
        _myTexpr.centering_by_x = (x-side)/2.0;      // центрирование по иксу
        _myTexpr.centering_by_y = (y-side)/2.0;      // центрирование по  игрику
    
        _myTexpr.font_size_wgt = side/40.0;          // размер текста
        _myTexpr.size_mask = side/50.0;              //  ширина маски (так сказать толщина обводов )
    }
    
    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved