如何在 QGraphicsItem 中包装文本?
How can I wrap text in 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
子类中,形状不是矩形?
(如上图所示)
我尝试使用 clipRegion
,请参阅上面的代码,但我想这不是正确的方法,剪裁会剪切文本但不会换行。
也许会...如果我能首先弄清楚如何换行?
Qt 4.8
作为对 1) 的回答,我选择不使用 QGraphicsTextItem,而是使用 drawText overloaded function, which takes a QTextOption 参数直接在 QGraphicsItem 的绘图函数中绘制文本。
使用它,您可以设置 WrapMode,例如,通过调用
QTextOption::setWrapMode(QTextOption:: WordWrap)
至于 2) 非矩形形状,我认为 Qt 不会为您做这件事。
您可以自己动手,使用 QFontMetrics 计算出每行适合多少文本,具体取决于文本在其边界项中的位置。
或者,您可以调整 text-to-path method 的概念。
您没有指定 Qt 版本,但请尝试:
void QGraphicsTextItem::setTextWidth(qreal width)
Sets the preferred width for the item's text. If the actual text is wider than >the specified width then it will be broken into multiple lines.
If width is set to -1 then the text will not be broken into multiple lines >unless it is enforced through an explicit line break or a new paragraph.
The default value is -1.
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
子类中,形状不是矩形?
(如上图所示)
我尝试使用 clipRegion
,请参阅上面的代码,但我想这不是正确的方法,剪裁会剪切文本但不会换行。
也许会...如果我能首先弄清楚如何换行?
Qt 4.8
作为对 1) 的回答,我选择不使用 QGraphicsTextItem,而是使用 drawText overloaded function, which takes a QTextOption 参数直接在 QGraphicsItem 的绘图函数中绘制文本。
使用它,您可以设置 WrapMode,例如,通过调用
QTextOption::setWrapMode(QTextOption:: WordWrap)
至于 2) 非矩形形状,我认为 Qt 不会为您做这件事。
您可以自己动手,使用 QFontMetrics 计算出每行适合多少文本,具体取决于文本在其边界项中的位置。
或者,您可以调整 text-to-path method 的概念。
您没有指定 Qt 版本,但请尝试:
void QGraphicsTextItem::setTextWidth(qreal width)
Sets the preferred width for the item's text. If the actual text is wider than >the specified width then it will be broken into multiple lines.
If width is set to -1 then the text will not be broken into multiple lines >unless it is enforced through an explicit line break or a new paragraph.
The default value is -1.