如何在QGraphicsItem中换行文本?

6

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个回答

5
您没有说明Qt版本,但可以尝试以下方法:
void QGraphicsTextItem::setTextWidth(qreal width)
设置项文本的首选宽度。如果实际文本比指定的宽度更宽,则会将其分成多行。
如果将宽度设置为-1,则文本将不会被分成多行,除非通过显式换行或新段落进行强制执行。
默认值为-1。

(我还编辑了问题以显示Qt版本4.8,抱歉遗漏) - Thalia
这就是我所缺少的!这是一个更简单和直接的修复方法 - 尽管我可能不得不完全改变我的项目实现... - Thalia

3

针对1)的回答,我建议不要使用QGraphicsTextItem,而是在您的QGraphicsItem的paint函数中直接绘制文本,使用重载的drawText函数,并传入一个QTextOption参数。

使用这种方法,您可以通过调用WrapMode来设置换行模式,例如:

QTextOption::setWrapMode(QTextOption:: WordWrap)

关于2)非矩形形状,我认为Qt不会为您完成此操作。
您可以自己使用QFontMetrics,根据其在边界项中的位置,计算出每行可容纳多少文本。
或者,您可以改编text-to-path method的概念。

我考虑了许多原因,但是我不会失去文本编辑功能吗?我仍然希望在放置在画布上后能够编辑文本 - 我现在可以通过控制 setTextInteractionFlags 来实现。 - Thalia
此外,我看到了这个有关使用QFontMetrics问题,它似乎是一个很好的想法 - 但我不知道如何在文本中换行而不添加\n - 这将是不好的,因为文本以后可能会更改,无论是内容还是大小... 这很难! - Thalia
1
“我会失去文本编辑功能吗?” - 简单来说,是的。但是,我会创建自己的GraphicsTextItem来进行绘制并允许编辑。或者,当选择该项时,您可以显示一个QGraphicsTextItem以供编辑,并在完成后将信息传输到您自己的类中,以按照您想要的方式进行绘制。 - TheDarkKnight
这很难 - 没有人说过它会很容易!与添加转义行结束符不同,我会选择单独绘制每个字符,就像text-to-path所做的那样。这将为您提供所需的灵活性,并且您将花费更少的时间来尝试在哪里动态放置/n字符。 - TheDarkKnight
1
我正在考虑——或许在QGraphicsItem子类中添加一个QGraphicsTextItem成员对象,或者保持当前的继承关系,但在paint函数中绘制文本而不是调用QGraphicsTextItem::paint函数...感谢您的建议,现在我有更多的实验要做了 :-) - Thalia
我会接受另一个答案 - setTextWidth 是我第一个问题的确切答案 - 即使我可能需要复杂化实现才能 完全 满足我的需求。(尽管你的回答给了我更多有用的信息并指引我朝更好的方向前进) - Thalia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接