我試圖使用QTextLayout
一個一個地渲染行。我嘗試將wrapMode
設置爲QTextOption::ManualWrap
,並且爲每行調用QTextLine::setNumColumns
,但整個文本顯示在一行中。QTextLayout手動分行
我也嘗試將wrapMode
設置爲QTextOption::WrapAnywhere
,這一次文本被分解成行,但空行(僅包含\n
的行)不可見。
我試圖鏈接對Qt4
和Qt5
沒有結果。
我在做什麼錯?
我試圖使用QTextLayout
一個一個地渲染行。我嘗試將wrapMode
設置爲QTextOption::ManualWrap
,並且爲每行調用QTextLine::setNumColumns
,但整個文本顯示在一行中。QTextLayout手動分行
我也嘗試將wrapMode
設置爲QTextOption::WrapAnywhere
,這一次文本被分解成行,但空行(僅包含\n
的行)不可見。
我試圖鏈接對Qt4
和Qt5
沒有結果。
我在做什麼錯?
事實證明,Qt
通過爲每一行創建一個新的QTextLayout
來實現此目的。詳情可在QPlainTextEdit::paintEvent(QPaintEvent *)
source中找到。
您可以使用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
和進行配置),但我無法弄清楚如何正確設置換行符。計算像素中的線寬並不容易,因爲QFontMetrics::size()
不支持除左對齊之外的製表位。
我能夠通過爲文本中的每一行創建一個新的'QTextLayout'來解決這個問題。而不是一次處理所有行的單個佈局。 – piotrekg2
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「包含。 我希望這有幫助。
[這裏](https://doc.qt.io/archives/qq/qq24-textlayouts.html)你有一個很好的例子。 – Tarod
@Tarod你所展示的例子使用'setLineWidth'來設置以像素爲單位的線條長度,而我需要在文本中的特定點處打斷。 – piotrekg2