2016-10-16 3 views
0

Я пытаюсь сделать строки один за другим, используя QTextLayout. Я попытался установить wrapMode на QTextOption::ManualWrap и позвонить QTextLine::setNumColumns для каждой строки, но весь текст появится в одной строке.QTextLayout ручная разметка строки

Я также пытался установить wrapMode на QTextOption::WrapAnywhere, и на этот раз текст разбит на строки, но пустые строки (те, которые состоят только из \n), не отображаются.

Я пытался связать как с Qt4, так и с Qt5 без каких-либо результатов.

Что я делаю неправильно?

+0

[Здесь] (https://doc.qt.io/archives/qq/qq24-textlayouts.html) у вас есть хороший пример. – Tarod

+0

@Tarod в примере, который вы указали, используется 'setLineWidth', который задает длину строки в пикселях, тогда как мне нужно разбить определенные точки в тексте. – piotrekg2

ответ

0

Оказывается, что Qt реализует это путем создания нового QTextLayout для каждой строки. Подробности можно найти в QPlainTextEdit::paintEvent(QPaintEvent *)source.

1

QTextLine Используется для текста с одной строкой. Если вы хотите несколько строк, используйте QTextEdit.

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(); 

Где layout является QTextLayout, который вы могли бы определить в качестве члена в вашем классе виджета или любой другой. Но имейте в виду, что (по крайней мере, в Qt 4.8.x) это может работать не так, как ожидалось, если вы используете вкладки. Я попытался создать макет с правой и левой вкладкой (который можно настроить через QTextOption и QTextOption::Tab), но я не мог понять, как заставить его правильно установить разрывы строк. Вычисление ширины линии в пикселях также непросто, потому что 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 "содержит. Надеюсь, это поможет.

Смежные вопросы