我正在寻找基于给定QGraphicsItem
的长度来确定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);
}
我可以将哪些代码添加到构造函数中以使我的需求有效?根据字符串的总长度设置宽度,假设每个字符占用多少像素空间是最明显的解决方案,但我正在寻找更优雅的东西。有任何想法吗?提前感谢您的帮助。
答案 0 :(得分:1)
QFontMetrics类有一个名为boundingRect的函数,它接受您想要打印的字符串,并根据您用于初始化QFontMetrics的QFont返回字符串的QRect。
如果你想换行,那么你需要计算字符串中允许boundingRect返回适合你的QGraphicsItem的boundingRect的QRect的最大单词数。
答案 1 :(得分:1)
您可以向小部件询问font
并从QFontMetrics docs
中查看此代码段QFont font("times", 24);
QFontMetrics fm(font);
int pixelsWide = fm.width("What's the width of this text?");
int pixelsHigh = fm.height();
编辑:正如Merlin在评论中所说,使用
QRect QFontMetrics::boundingRect ( const QString & text ) const 所以:
int pixelsWide = fm.boundingRect(“这个文本的宽度是多少?”)。width();