如何在QGraphicsItem中包装文本?

时间:2015-06-17 14:53:08

标签: qt text word-wrap qgraphicsitem

1)如何在QGraphicsTextItem中包装文字以适合宽度和高度的固定矩形?

现在我正在尝试创建一个文本,获取它的边界矩形,并调整它以适应盒子 - 但我无法包装。

class TTT: public QGraphicsTextItem {
    TTT() {
    {
        setPlainText("abcd");
        qreal x = m_itemSize.width()/boundingRect().width();
        qreal y = m_itemSize.height()/boundingRect().height();
        scale(x, y);
    }
    void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {
        // experiment with clip regions
        // text gets covered by hole in clip
        QRegion r0(boundingRect().toRect());
        QRegion r1(QRect(5, 5, 10, 10), QRegion::Ellipse);
        QRegion r2 = r0.subtracted(r1);
        painter->setClipRegion(r2);
        painter->setBrush(Qt::yellow);
        painter->drawRect(boundingRect());
        QGraphicsTextItem::paint(painter, option, widget);
    }
}

是什么让包装发生,我该如何触发呢?

现在,当我一直打字时,该框会自动展开。

2)是否可以将文本包装在不是矩形的QGraphicsItem / QGraphicTextItem子类中? enter image description here

(如上图所示)
我尝试使用clipRegion,请参阅上面的代码,但我想这不是正确的方法,剪切剪切文本但没有换行。

也许会......如果我能弄清楚如何首先包装文字?

Qt 4.8

2 个答案:

答案 0 :(得分:4)

您没有指定Qt版本,但请尝试:

  

void QGraphicsTextItem :: setTextWidth(qreal width)

     

设置项目文本的首选宽度。如果实际文本宽于>指定的宽度,则它将被分成多行。

     

如果width设置为-1,那么除非通过显式换行符或新段落强制执行,否则文本不会分成多行>

     

默认值为-1。

答案 1 :(得分:3)

在回答1)时,我选择不使用QGraphicsTextItem,而是使用drawText重载函数直接在QGraphicsItem的绘制函数中绘制文本,该函数需要{{3参数。

使用此功能,您可以设置WrapMode,例如,调用

QTextOption::setWrapMode(QTextOption:: WordWrap)

至于2)非矩形形状,我不认为Qt会为你做这件事。

自己动手,你可以使用QTextOption来确定每行中适合的文字数量,具体取决于它在其边界项目中的位置。

或者,您可以调整QFontMetrics的概念。