Как нарисовать треугольник и ромб с помощью QT

Мне нужно нарисовать форму треугольника и форму ромба, как это изображение. В этом коде, который проектирует форму треугольника (рисунок 1), но мне нужно добавить эту форму к тексту «TRI«. И мне также нужно реализовать этот код для проектирования формы ромба, как (рисунок 2). Пожалуйста, помогите мне решить эту проблему.

Рисунок 1

void MainWindow::on_btnTri_clicked()
{
QPen redPen(Qt::black);
redPen.setWidth(2);
QRectF rect = QRectF(0, 0, 200, 200);

QPainterPath path;
path.moveTo(rect.left() + (rect.width() / 2), rect.top());
path.lineTo(rect.bottomLeft());
path.lineTo(rect.bottomRight());
path.lineTo(rect.left() + (rect.width() / 2), rect.top());
QGraphicsPathItem* item = ui->graphicsView->scene()->addPath(path, redPen);
item->setFlag(QGraphicsItem::ItemIsMovable, true);
item->setFlag(QGraphicsItem::ItemIsSelectable,true);
}

введите описание изображения здесь

фигура 2 Я использую этот код для разработки фигура 2 Но который не может передавать параметры для изменения размера, мой код, разработанный на рисунке 1, я могу передать два параметра QRectF(0, 0, para1, para2); это для изменения размера треугольника. поэтому мне нужно изменить этот код, чтобы сделать то же самое, используя QPainterPath или любым другим способом.

void MainWindow::on_btnRomb_clicked()
{
QPolygonF romb;
romb.append(QPointF(20,40));
romb.append(QPointF(0,20));
romb.append(QPointF(20,0));
romb.append(QPointF(40, 20));
QGraphicsPolygonItem* itemR = ui->graphicsView->scene()->addPolygon(romb);
itemR->setFlag(QGraphicsItem::ItemIsMovable);
}

0

Решение

Вы должны использовать addText() метод QPainterPath, чтобы разместить его в центре, вы должны рассчитать ширину и высоту текста для него QFontMetrics используется:

QPen redPen(Qt::black);
redPen.setWidth(2);
QRectF rect(0, 0, 200, 200);

QPainterPath path;
path.moveTo(rect.left() + (rect.width() / 2), rect.top());
path.lineTo(rect.bottomLeft());
path.lineTo(rect.bottomRight());
path.lineTo(rect.left() + (rect.width() / 2), rect.top());
path.moveTo(rect.center());

QFont font("Times", 20, QFont::Bold);

QFontMetrics fm(font);
QString text = "TRI";
QSize size = fm.size(Qt::TextSingleLine, text);
path.addText(rect.center()+ QPointF(-size.width()*0.5, size.height()*0.5), font, text);

QGraphicsPathItem *item = ui->graphicsView->scene()->addPath(path, redPen);
item->setFlag(QGraphicsItem::ItemIsMovable, true);
item->setFlag(QGraphicsItem::ItemIsSelectable,true);

Для случая ромба вы должны получить только середины каждой вершины:

QPainterPath path;
QRectF rect(0, 0 , 100, 100);
path.moveTo(rect.center().x(), rect.top());
path.lineTo(rect.right(), rect.center().y());
path.lineTo(rect.center().x(), rect.bottom());
path.lineTo(rect.left(), rect.center().y());
path.lineTo(rect.center().x(), rect.top());
QGraphicsPathItem* itemR = ui->graphicsView->scene()->addPath(path);
itemR->setFlag(QGraphicsItem::ItemIsMovable);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]