Qt 如何在QGraphicsItem中包装文本?

Qt 如何在QGraphicsItem中包装文本?,qt,text,word-wrap,qgraphicsitem,Qt,Text,Word Wrap,Qgraphicsitem,1) 如何在QGraphicsTextItem中包装文本以适应具有宽度和高度的固定矩形 现在,我正在尝试创建一个文本,获取它的边框,并调整它的大小以适应框-但我不能得到包装 class TTT: public QGraphicsTextItem { TTT() { { setPlainText("abcd"); qreal x = m_itemSize.width()/boundingRect().width(); qreal y

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
/
qgraphicstextitem
子类中?

(如上图所示)
我尝试使用
clipRegion
,请参见上面的代码,但我想这不是正确的方法,剪切会剪切文本,但不会进行包装

也许会。。。如果我能先弄清楚如何包装文本

Qt 4.8在回答1)时,我选择不使用QGraphicsTextItem,而是使用重载函数直接在QGraphicsItem的paint函数中绘制文本,重载函数接受一个参数

使用此选项,您可以设置WrapMode,例如,通过调用

QTextOption::setWrapMode(QTextOption:: WordWrap)
至于2)非矩形的形状,我认为Qt不会为您这样做

您可以使用自己动手,计算出每行可以容纳多少文本,这取决于文本在其边界项中的位置


或者,您可以调整Qt版本的概念。

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

void QGraphicsTextItem::setTextWidth(qreal宽度)

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

如果宽度设置为-1,则文本将不会被拆分为多行>,除非通过显式换行或新段落强制执行

默认值为-1


我考虑过这个选项有很多原因,但我不会失去文本编辑功能吗?我仍然希望文本一旦放在画布上就可以编辑-现在我也可以通过控制
setTextInteractionFlags
来编辑,我看到过关于使用
QFontMetrics
的这一点,这似乎是一个不错的主意——除了我不知道如何在文本中不添加
\n
的情况下进行包装外——这将很糟糕,因为文本稍后可能会更改,无论是内容还是大小。。。这很难!我会失去文本编辑功能吗?简单地说,是的。但是,我会创建自己的GraphicsTextItem来绘制并允许编辑。或者,当项目被选中时,您可以显示一个QGraphicsTextItem以供编辑,完成后,将信息传输到您自己的类中,该类会根据您的需要绘制它。这很难-没有人说这很容易!与添加转义的行尾字符不同,我将分别绘制每个字符,就像使用。这将为您提供所需的灵活性,并且您将花费更少的时间尝试动态放置/n字符的位置。我正在考虑-在
QGraphicsTextItem
子类中添加
QGraphicsTextItem
成员对象。。或者保留当前继承,但在
paint
中绘制文本,而不是调用
QGraphicsTextItem::paint
。。。谢谢你的建议,我现在还有更多的实验要做:-)(我还编辑了这个问题,Qt版本4.8,很抱歉遗漏)这就是我所缺少的!这是一个更简单和直接的修复-我可能不得不完全改变我的项目实现虽然。。。