how to draw an arch correctly via QPainterPath ??
Unsolved
Qt Creator and other tools
-
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);
i paint arc use QPainterPath (this no work )
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; // ширина маски (так сказать толщина обводов ) }