0

我正在寻找QGraphicsItem根据给定长度调整 a大小的最有效方法QString,以便文本始终包含在 QGraphicsItem 的边界内。这个想法是保持QGraphicsItem尽可能小,同时仍以清晰的大小包含文本。以一定的宽度阈值缠绕到多条线上也是理想的。例如,

TestModule::TestModule(QGraphicsItem *parent, QString name) : QGraphicsPolygonItem(parent)
{
    modName = name;
    // what would be the best way to set these values?
    qreal w = 80.0; 
    qreal h = 80.0;
    QVector<QPointF> points = { QPointF(0.0, 0.0),
                                QPointF(w, 0.0),
                                QPointF(w, h),
                                QPointF(0.0, h) };
    baseShape = QPolygonF(points);
    setPolygon(baseShape);
}

void TestModule::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QBrush *brush = new QBrush(Qt::gray, Qt::SolidPattern);
    painter->setBrush(*brush);
    painter->drawPolygon(baseShape);
    painter->drawText(QPointF(0.0, 40.0), modName);
}

我可以在构造函数中添加什么代码来满足我的需求?根据字符串的总长度设置宽度,假设每个字符占用多少像素空间是最明显的解决方案,但我正在寻找更优雅的东西。有任何想法吗?预先感谢您的任何帮助。

4

2 回答 2

1

QFontMetrics 类有一个名为 boundingRect 的函数,它根据您用来初始化 QFontMetrics 的 QFont 获取您要打印的字符串并返回该字符串的 QRect。

如果你想换行,那么你需要计算出你的字符串中的最大单词数,这将允许boundingRect返回一个适合你的QGraphicsItem的boundingRect的QRect。

于 2013-06-19T14:12:31.053 回答
1

看看QFontMetrics

您可以向您的小部件询问字体

并检查 QFontMetrics 文档中的这个片段

QFont font("times", 24);
 QFontMetrics fm(font);
 int pixelsWide = fm.width("What's the width of this text?");
 int pixelsHigh = fm.height();

编辑:正如梅林在评论中所说,使用

QRect QFontMetrics::boundingRect ( const QString & text ) const 所以:

int pixelWide = fm.boundingRect("这个文本的宽度是多少?").width();

于 2013-06-19T14:19:27.483 回答