QTextLayout手动换行

时间:2016-10-16 23:35:48

标签: c++ qt4 qt5

我尝试使用QTextLayout逐个渲染线条。我尝试将wrapMode设置为QTextOption::ManualWrap并为每一行调用QTextLine::setNumColumns,但整个文字只显示在一行中。

我还试图将wrapMode设置为QTextOption::WrapAnywhere,这次文本被分成几行,但空行(仅由\n组成的行)是不可见。

我已尝试与Qt4Qt5进行关联但没有结果。

我做错了什么?

4 个答案:

答案 0 :(得分:0)

QTextLine用于单行文字。如果您想要多行,请使用QTextEdit

答案 1 :(得分:0)

事实证明,Qt通过为每一行创建新的QTextLayout来实现此目的。详细信息可在QPlainTextEdit::paintEvent(QPaintEvent *) source中找到。

答案 2 :(得分:0)

您可以使用QTextLine::setNumColumns()指定适合当前行的字符数,直到它中断为止。如果您知道文本行的长度,则可以将每行精确地分成您想要的位置。 QTextLayout似乎忽略了换行符。

QTextOption opt;
opt.setWrapMode(QTextOption::WrapAnywhere);

QStringList text;
text.append("First line");
text.append("Another line");

layout.setText(text.join(""));
layout.beginLayout();

qreal h = 0;
for(const auto& line : text)
{
   QTextLine l = layout.createLine();
   if(!l.isValid()
      break;
   l.setNumColumns(line.length());
   l.setPosition(QPointF(0, h);
   h += l.height();
}

layout.endLayout();

layoutQTextLayout,您可以将其定义为窗口小部件类中的成员或其他任何内容。但要注意(至少在Qt 4.8.x中)如果使用制表符,这可能无法正常工作。我试图创建一个具有右侧和左侧制表位的布局(可以通过QTextOptionQTextOption::Tab进行配置)但我无法弄清楚如何正确设置换行符。以像素为单位计算线宽也不容易,因为QFontMetrics::size()不支持除左对齐之外的制表位。

答案 3 :(得分:0)

QTextLine

QTextLayout.createLine();

QTextLayout可以绘制一个QTextBlock ENTER 字符或键是创建新的QTextBlock。因此,您必须为每个块绘制布局。

QTextBlock不包含"\n"个字符,因为此字符将文本拆分为新QTextBlock

我使用这个例子:

class KonuIcerik : public QGraphicsTextItem
{
public:
    QRectF boundingRect() const
    {
        return QRectF( 0 , 0 , this->LineWidth , this->height );
    }


    int height;
    int LineWidth;
    int LineCountMod;
    int CallNumber;
    QString metin;
    QFont font;
    QTextEdit* textEdit;

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
               QWidget *widget)
    {

        int y = 0 ;
        CallNumber = 0;
        int PageNumber = 1;

        for( int i = 0 ; i < textEdit->document()->blockCount() ; i++ ){

            QTextBlock block = textEdit->document()->findBlockByNumber(i);
            QTextLayout layout(block);
            layout.setFont(font);

            layout.beginLayout();

            while( true ){
                QTextLine line = layout.createLine();
                if( !line.isValid() ){
                    break;
                }else{
                    if( CallNumber > 37 &&  (CallNumber-37) % LineCountMod == 0 ){
                        y += 300;
                        PageNumber++;
                    }
                    CallNumber++;
                    if( CallNumber == 37 ){
                        y += 300;
                        PageNumber++;
                    }

                    line.setLineWidth( LineWidth );
                    line.setPosition( QPointF( 0 , y ) );
                    y += line.height();
                }
            }
            this->height = y;
            layout.endLayout();
            layout.draw(painter,QPointF(0,0));
        }
    }
    void UPdate(){
        update(-50,-50 , LineWidth+50 , height+50);
    }
};

您引用此类,如果“\ n”包含,您会看到新行。 我希望这有用。