基于字符串长度尺寸的QGraphicsItem(Size QGraphicsItem based o

2019-10-30 07:14发布

我在寻找最有效的方法,以大小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);
}

什么样的代码可能我添加到构造,使我的要求工作? 根据设置字符串的总长度宽度,使得假设每个字符有多少像素的空间占用是最明显的解决方案,但我正在寻找的东西多一点优雅。 有任何想法吗? 预先感谢您的任何帮助。

Answer 1:

该QFontMetrics类有一个叫做boundingRect函数,它接受,你想打印字符串,并返回查阅QRect的字符串,根据您用来initalise QFontMetrics的QFont。

如果你想换行,那么你就需要制定出在你的字符串中的单词的最大数量,将允许boundingRect来回报您的QGraphicsItem的boundingRect内符合这一查阅QRect一个。



Answer 2:

看看到QFontMetrics

你可以问你的widget的字体

并检查从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(常量QString的&文本)常量所以:

。INT pixelsWide = fm.boundingRect( “?这是什么文本的宽度”)宽();



文章来源: Size QGraphicsItem based on string length