有没有办法让每一行都显示在 QTextEdit 中?
我有一些未格式化的文本显示在 QTextEdit 中,如下所示:
QString someText = "bla bla bla bla bla bla bla bla bla bla bla bla bla";
QTextEdit* texEdit = new QTextEdit();
textEdit->setLineWrapMode(QTextEdit::FixedColumnWidth);
texEdit->setLineWrapColumnOrWidth(38);
texEdit->setWordWrapMode(QTextOption::WordWrap);
texEdit->setText(someText);
在 textEdit 中将“someText”显示为 2 行
bla bla bla bla bla bla bla bla bla
bla bla bla bla
现在我想让每一行都显示在我的 QTextEdit 中。 但是我还没有做到这一点。
起初我天真地尝试过
textEdit->toPlainText().split("\n")
不幸的是,它没有给我换行,因为换行不会插入换行符。
所以我想也许 QTextDocument 是要走的路,结果也是一条死胡同。
QTextDocument* doc = textEdit->document();
qDebug() << "document linecount: " << doc->lineCount();
qDebug() << "block count:" << doc->blockCount();
qDebug() << "lines in block: " << doc->findBlock(1).lineCount();
其中每一个都返回 1。
非常感谢任何帮助,谢谢!
最佳答案
您需要将换行文本的每一行(如它在 QTextEdit 中显示的那样)作为单独的 QString,对吗?
QTextDocument来自 QTextEdit 控件的文本按段落存储(由 QTextBlock 表示),每个段落布局为一组文本行(QTextLine)。您只需要从那里提取这些文本行。这是我的代码示例。
QStringList splitByLines(const QTextDocument *doc)
{
if(!doc)
return QStringList();
QStringList ret;
QTextBlock tb = doc->begin();
while(tb.isValid())
{
QString blockText = tb.text();
Q_ASSERT(tb.layout());
if(!tb.layout())
continue;
for(int i = 0; i != tb.layout()->lineCount(); ++i)
{
QTextLine line = tb.layout()->lineAt(i);
ret.append(blockText.mid(line.textStart(), line.textLength()));
}
tb = tb.next();
}
return ret;
}
现在您只需调用 splitByLines(textEdit->document()) 即可获得您想要的内容。请注意,当文档布局(请参阅 documentLayoutChanged() )或内容(请参阅 contentsChanged() )更改时,您必须重新提取行。
关于c++ - 获取 QTextEdit 的包装线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47038001/