0

我需要像这张图片一样绘制三角形和菱形。在这个设计三角形的代码中(图 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);
}
4

1 回答 1

1

您必须使用 的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);
于 2017-12-17T16:12:37.690 回答