获取QTextEdit的包装线

时间:2017-10-31 14:37:16

标签: c++ qt

有没有办法让每一行显示在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);

显示" someText"作为textEdit中的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。

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:5)

你需要将包装文本的每一行(因为它显示在QTextEdit中)作为单独的QString,对吗?

来自QTextEdit控件的

QTextDocument按段落(由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-&gt; document())即可获得所需内容。请注意,当文档布局(请参阅documentLayoutChanged())或内容(请参阅contentsChanged())更改时,您必须重新提取行。