Is stroke the text (Circle text )
-
I want to stroke the text, like this
how to create outlines in a function drawText() in classes QPainter ? ??
my primer
#include "spidometr_widget.h" #include <math.h> #include <QDebug> spidometr_widget::spidometr_widget(QWidget *parent) : QWidget(parent) { // #include <math.h> #include <QDebug> float a_t_pitch = 30.0; if((fmod(a_t_pitch, float(30))) == float(0.0)) { qDebug() << "qwerrt"; } // обявление максимальная скорость // setSpidometr(100, "QString nadp"); setSpidometr_value(0, "", "", ""); } spidometr_widget::~spidometr_widget() { } void spidometr_widget::paintEvent(QPaintEvent *event) { QPainter painter(this); // Создаём объект отрисовщика QBrush bgfon(QColor(48,172,220),Qt::NoBrush); // устанавливаем цвет фона и тип заливки (с фоном без фона и тип заливки) QBrush maska(QColor(48,172,220,120),Qt::SolidPattern); // для маски QPen pen_maska(Qt::NoPen); painter.setRenderHint(QPainter::Antialiasing); // убираем резкие кубики _myTexpr.m_t_razm[0] = 14; // выставляем размеры ширины линии QPen pen_skor_zap(Qt::green, _myTexpr.m_t_razm[0], Qt::SolidLine, Qt::FlatCap); // кисть для скорости QPen pen_skor_pyst(Qt::black, _myTexpr.m_t_razm[0], Qt::SolidLine, Qt::FlatCap); // кисть для заполения (не скорости) painter.setBrush(bgfon); // задаём цвет фона painter.setPen(pen_skor_zap); // Устанавливаем кисть для линий и текста // блок чтоб не пересчитывать если размеры не изменились if( _myTexpr.razm_ekran_X != this->width()) { _myTexpr.razm_ekran_X = this->width(); _myTexpr.razm_ekran_Y = this->height(); razmer_spidometr(this->width(), this->height()); // _myTexpr.svoistv_shrift("Areal", _myTexpr.m_t_razm[9], QFont::Light); // свойства шрифта } if(_myTexpr.razm_ekran_Y != this->height()) { _myTexpr.razm_ekran_X = this->width(); _myTexpr.razm_ekran_Y = this->height(); razmer_spidometr(this->width(), this->height()); // _myTexpr.svoistv_shrift("Areal", _myTexpr.m_t_razm[9], QFont::Light); // свойства шрифта } // тут обводы и маску задаём // QRectF rectangle0(0,0,_myTexpr.m_t_razm[2] - _myTexpr.m_t_razm[5]/2.0+_myTexpr.m_t_razm[0], // _myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[5]/2.0+_myTexpr.m_t_razm[0]); QRectF rectangle0( _myTexpr.m_t_razm[2] - _myTexpr.m_t_razm[5]/2.0/*+_myTexpr.m_t_razm[0]*/, _myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[5]/2.0/*+_myTexpr.m_t_razm[0]*/, _myTexpr.m_t_razm[5]/*-_myTexpr.m_t_razm[0]*2*/, _myTexpr.m_t_razm[5]/*-_myTexpr.m_t_razm[0]*2*/); // задаём прямоугольник painter.setBrush(maska); // задаём цвет фона painter.setPen(pen_maska); painter.drawRect(rectangle0); // вертаем назад painter.setBrush(bgfon); // задаём цвет фона painter.setPen(pen_skor_zap); QRectF rectangle( _myTexpr.m_t_razm[2] - _myTexpr.m_t_razm[5]/2.0+_myTexpr.m_t_razm[0], _myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[5]/2.0+_myTexpr.m_t_razm[0], _myTexpr.m_t_razm[5]-_myTexpr.m_t_razm[0]*2, _myTexpr.m_t_razm[5]-_myTexpr.m_t_razm[0]*2); // задаём прямоугольник через рамеры (размеры экрана минус ширина текста) QFont razm_shrift("Areal", _myTexpr.m_t_razm[7]*2.4, QFont::Light); // свойства шрифта painter.setFont(razm_shrift); // устанавливаем размер шрифта QFontMetrics stroka_razm = painter.fontMetrics(); // метрика шрифта // QString("$%1").arg(_myTexpr.m_t_razm[4]/_myTexpr.speed_shag) // _myTexpr.m_t_razm[4] =_myTexpr.m_t_razm[4]/_myTexpr.speed_shag; _myTexpr.nadp1 = QString::number(_myTexpr.m_t_razm[4]/_myTexpr.speed_shag, 'f', 1); // переводим число в строку. _myTexpr.nadp1 = QString("%1").arg(_myTexpr.nadp1); // QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect(this); // effect->setOffset(-1, -1); // effect->setColor(Qt::yellow); // ui->label->setGraphicsEffect(effect); // _myTexpr.nadp1.set // -------- QPainterPath path; // path.addText(x, y, font(), text()); // painter.fillPath(path, palette().windowText()); painter.strokePath(path, QPen(QColor(255, 0, 0, 250), 10)); // -------- _myTexpr.m_t_razm[8] = stroka_razm.width(_myTexpr.nadp1); // узнаём ширину строки painter.drawText((_myTexpr.m_t_razm[2]-_myTexpr.m_t_razm[8]/2.0), /* тут ввод текста */ (_myTexpr.m_t_razm[3]-_myTexpr.m_t_razm[7]/2.0), _myTexpr.nadp1); // рисуем надпись painter.strokePath(path, QPen(QColor(255, 0, 0, 255), 2)); QFont razm_shrift1("Areal", _myTexpr.m_t_razm[7]*0.6, QFont::Light); // свойства шрифта painter.setFont(razm_shrift1); // устанавливаем размер шрифта stroka_razm = painter.fontMetrics(); // метрика шрифта _myTexpr.m_t_razm[8] = stroka_razm.width(_myTexpr.nadp2); // узнаём ширину строки painter.drawText((_myTexpr.m_t_razm[2]-_myTexpr.m_t_razm[8]/2.0), (_myTexpr.m_t_razm[3]+_myTexpr.m_t_razm[5]/4.0-_myTexpr.m_t_razm[7]/2.0), _myTexpr.nadp2); // рисуем надпись QFont razm_shrift2("Areal", _myTexpr.m_t_razm[7], QFont::Light); // свойства шрифта painter.setFont(razm_shrift2); // устанавливаем размер шрифта stroka_razm = painter.fontMetrics(); // метрика шрифта _myTexpr.m_t_razm[8] = stroka_razm.width(_myTexpr.nadp3); // узнаём ширину строки painter.drawText((_myTexpr.m_t_razm[2]-_myTexpr.m_t_razm[8]/2.0), (_myTexpr.m_t_razm[3]+_myTexpr.m_t_razm[5]/2.0-_myTexpr.m_t_razm[7]/2.0), _myTexpr.nadp3); // рисуем надпись //-- // float ass = _myTexpr.m_t_razm[2]-_myTexpr.m_t_razm[7]/2.0; // float ass1 = _myTexpr.m_t_razm[7]; // qDebug() << "ass" << ass << " _myTexpr.razm_ekran_X" << _myTexpr.razm_ekran_X; // qDebug() << "ass1" << ass1 << " _myTexpr.m_t_razm[2]" << _myTexpr.m_t_razm[2]; // тут заполнение рисую заполненную засть и не заполненную спидометр int startAngle = 0 * 16; int spanAngle = 262 * 16; // painter.drawArc(rectangle, startAngle, spanAngle); // арка скорости painter.translate(this->width()/2.0, this->height()/2.0); painter.rotate(41); painter.translate( -this->width()/2.0, -this->height()/2.0); painter.setPen(pen_skor_zap); // Устанавливаем кисть для линий и текста // startAngle, _myTexpr.m_t_razm[4] painter.drawArc(rectangle, spanAngle-_myTexpr.m_t_razm[4], _myTexpr.m_t_razm[4]); // арка скорости qDebug() << "spanAngle-_myTexpr.m_t_razm[4]" << spanAngle-_myTexpr.m_t_razm[4]; qDebug() << "_myTexpr.m_t_razm[4]" << _myTexpr.m_t_razm[4]; painter.setPen(pen_skor_pyst); // Устанавливаем кисть для линий и текста painter.drawArc(rectangle,-_myTexpr.m_t_razm[4] -spanAngle/2.66, -spanAngle+(_myTexpr.m_t_razm[4])); // арка скорости // painter.rotate-41); // _myTexpr.m_t_razm[4], spanAngle-_myTexpr.m_t_razm[4] // painter.drawArc(rectangle,-(spanAngle-_myTexpr.m_t_razm[4]), -_myTexpr.m_t_razm[4]); // арка заплнения // painter.drawArc(rectangle, (spanAngle-_myTexpr.m_t_razm[4])-_myTexpr.m_t_razm[4], _myTexpr.m_t_razm[4]); // арка заплнения // painter.drawArc(rectangle,-_myTexpr.m_t_razm[4], spanAngle+_myTexpr.m_t_razm[4]); // арка заплнения // painter.drawArc(rectangle,0, -4000); // арка заплнения //-------------------- // int startAngle = 0 * 16; // int spanAngle = 221 * 16; // painter.drawArc(rectangle, startAngle, spanAngle); // арка скорости // painter.setPen(pen_skor_pyst); // Устанавливаем кисть для линий и текста // startAngle = 0 * 16; // spanAngle = -41 * 16; // painter.drawArc(rectangle, startAngle, spanAngle); // арка заполнения //---- // startAngle = 341 * 16; // spanAngle = 0 * 16; // painter.drawArc(rectangle, startAngle, spanAngle); // арка заполнения // это влияет ! 0_o // painter.setRenderHint(QPainter::Antialiasing); // painter.setRenderHint(QPainter::TextAntialiasing); // painter.drawPixmap(0,0, _pix); } void spidometr_widget::keyPressEvent(QKeyEvent *event) { qDebug() << "_myTexpr.m_pitch: " << _myTexpr.m_t_razm[4]; switch (event->key()) { case Qt::Key_Down: // _myTexpr.m_pitch++; _myTexpr.m_t_razm[4] += 10.0; if(_myTexpr.m_t_razm[4] >= 4192) _myTexpr.m_t_razm[4] = 4192; break; case Qt::Key_Up: // _myTexpr.m_pitch--; _myTexpr.m_t_razm[4] -= 10.0; if(_myTexpr.m_t_razm[4] <= 0) _myTexpr.m_t_razm[4] = 0; break; default: QWidget::keyPressEvent(event); break; } update(); } void spidometr_widget::razmer_spidometr(int x, int y) { // размер линий float side = qMin(x, y); // _myTexpr.m_t_razm[0]; // ширина текстовой линии для ручки pen_skor_zap и pen_skor_pyst // _myTexpr.m_t_razm[1]; // ширина текстовой линии для ручки "резерв" _myTexpr.m_t_razm[2] = x/2.0; // вырвнивание по центру Х _myTexpr.m_t_razm[3] = y/2.0; // выравнивание по центру У // _myTexpr.m_t_razm[4]; // скорость _myTexpr.m_t_razm[5] = side; // минимальный размер из х и у // _myTexpr.m_t_razm[6]; // предел спидометра задаётся в setSpidometr _myTexpr.razm_lin_b = (_myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[2])* 3.1; //высота линии _myTexpr.razm_lin_m = (_myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[2])* 0.2; //высота линии малой _myTexpr.razm_text = (_myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[2])* 0.4; // высота текста //_myTexpr.razm_shrift = (_myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[2])*0.25; // ширина текста (шрифта) _myTexpr.m_t_razm[7] = side *0.085; // ширина текста (шрифта) // _myTexpr.m_t_razm[8]; // ширина строки _myTexpr.razm_shrift = side *0.085; // ширина текста (шрифта) } void spidometr_widget::setSpidometr_value(float max_speed, QString nadp1,QString nadp2, QString nadp3 ) { // _myTexpr.m_t_razm[6] = speed/262.0; // предел спидометра _myTexpr.speed_shag = 4192/max_speed; if(max_speed <= 0) { _myTexpr.speed_shag = 4192/100; } // вот тут заглушки _myTexpr.nadp1 = nadp1; _myTexpr.nadp2 = nadp2; _myTexpr.nadp3 = nadp3; if (nadp1.isEmpty() == true) { _myTexpr.nadp1 = "0"; } if (nadp2.isEmpty() == true) { _myTexpr.nadp2 = "КМ/Ч"; } if(nadp3.isEmpty() == true) { _myTexpr.nadp3 = "скорость"; } }
my trye
QPainterPath path; painter.strokePath(path, QPen(QColor(255, 0, 0, 250), 10)); // -------- _myTexpr.m_t_razm[8] = stroka_razm.width(_myTexpr.nadp1); // узнаём ширину строки painter.drawText((_myTexpr.m_t_razm[2]-_myTexpr.m_t_razm[8]/2.0), /* тут ввод текста */ (_myTexpr.m_t_razm[3]-_myTexpr.m_t_razm[7]/2.0), _myTexpr.nadp1); // рисуем надпись
-
QPainterPath path;
// path.addText(x, y, font(), text());
// painter.fillPath(path, palette().windowText());
painter.strokePath(path, QPen(QColor(255, 0, 0, 250), 10));QPainterPath::addText is the way to go:
QFont font=this->font(); font.setBold(true); font.setPixelSize(50); path.addText(x,y,font, "33"); QPen pen(Qt::darkGray); pen.setWidthF(font.pixelSize()/20.0); painter.strokePath(path,pen);
-
@mpergand tsanks
but my brain wery smal ;_;
```
QFont razm_shrift("Areal", _myTexpr.m_t_razm[7]*2.4, QFont::Light); // свойства шрифта
painter.setFont(razm_shrift); // устанавливаем размер шрифта
QFontMetrics stroka_razm = painter.fontMetrics(); // метрика шрифта_myTexpr.nadp1 = QString::number(_myTexpr.m_t_razm[4]/_myTexpr.speed_shag, 'f', 1); // переводим число в строку. _myTexpr.nadp1 = QString("%1").arg(_myTexpr.nadp1); QPainterPath path;
// QFont font=this->font();
// razm_shrift.setBold(true);
// razm_shrift.setPixelSize(100);path.addText((_myTexpr.m_t_razm[2]-_myTexpr.m_t_razm[8]/2.0), /* тут ввод текста */ (_myTexpr.m_t_razm[3]-_myTexpr.m_t_razm[7]/2.0), razm_shrift, _myTexpr.nadp1); QPen pen(Qt::darkGray);
// pen.setWidthF(razm_shrift.pixelSize()/20.0);
painter.strokePath(path, pen);so far only got this result cannot align the bypass line with the inner line ![Screenshot_20211216_190907.png](https://ddgobkiprc33d.cloudfront.net/483d2c5b-27f0-493c-862d-c3c2a55d3cf3.png) ![alt text](https://ddgobkiprc33d.cloudfront.net/483d2c5b-27f0-493c-862d-c3c2a55d3cf3.png)
-
@timob256 said in Is stroke the text (Circle text ):
cannot align the bypass line with the inner line
Sorry, i don't understand.
If you want the background to be green, add a fillPath before stroke path:
painter.fillPath(path,Qt::green); painter.strokePath(path,pen);