c++ - 获取 QTextEdit 的包装线

标签 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);

在 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/

相关文章:

c++ - Excel 调用 C++ 程序的函数

指向 const 指针的 C++ 指针

c++ - 结构的重新分配使程序崩溃

c++ - 最大连续子数组(元素数量最多)

QT Systray 图标出现在 Ubuntu 上的启动器旁边而不是面板上

c++ - 如何在 Qt .js 文件中使用 C++ 枚举?

c++ - 从 Qt 应用程序中删除标题栏

c++ - 结构的 QVector - 没有合适的默认构造函数可用

c++ - 如何调试 QTableView 的内部工作?

c++ - 使用构造函数重载初始化多个变量