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 ??

how to draw an arch correctly via QPainterPath ??

Scheduled Pinned Locked Moved Unsolved Qt Creator and other tools
1 Posts 1 Posters 310 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