2016-10-16 28 views
0

我試圖使用QTextLayout一個一個地渲染行。我嘗試將wrapMode設置爲QTextOption::ManualWrap,並且爲每行調用QTextLine::setNumColumns,但整個文本顯示在一行中。QTextLayout手動分行

我也嘗試將wrapMode設置爲QTextOption::WrapAnywhere,這一次文本被分解成行,但空行(僅包含\n的行)不可見。

我試圖鏈接對Qt4Qt5沒有結果。

我在做什麼錯?

+0

[這裏](https://doc.qt.io/archives/qq/qq24-textlayouts.html)你有一個很好的例子。 – Tarod

+0

@Tarod你所展示的例子使用'setLineWidth'來設置以像素爲單位的線條長度,而我需要在文本中的特定點處打斷。 – piotrekg2

回答

0

事實證明,Qt通過爲每一行創建一個新的QTextLayout來實現此目的。詳情可在QPlainTextEdit::paintEvent(QPaintEvent *)source中找到。

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中),如果使用製表符,這可能無法按預期工作。我試圖創建一個有左右製表符的佈局(可以通過QTextOption和​​進行配置),但我無法弄清楚如何正確設置換行符。計算像素中的線寬並不容易,因爲QFontMetrics::size()不支持除左對齊之外的製表位。

+0

我能夠通過爲文本中的每一行創建一個新的'QTextLayout'來解決這個問題。而不是一次處理所有行的單個佈局。 – piotrekg2

0

QTextLine通過QTextLayout.createLine();

QTextLayout可以得出一個QTextBlock,該ENTER charackter或關鍵是創造新的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「包含。 我希望這有幫助。