0

我想将QTextDocument多个QTextDocumentFragments 中的 a 放在一起,用 . 表示的水平规则分隔<HR>。像这样的东西(作为 ASCII 模型):

foo
-------
bar
-------
baz

我这样做的尝试(使用insertText()而不是insertFragment()现在,以尝试使基本方案正常工作,但同样的事情发生在insertFragment())看起来像这样:

QTextEdit *textedit = ui->descriptionTextEdit;
QTextDocument *textdoc = textedit->document();

textedit->clear();

QTextCursor insertion(textdoc);
insertion.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor);

insertion.insertText("foo");
insertion.insertBlock();
insertion.insertHtml("<HR>");
insertion.insertBlock();
insertion.insertText("bar");
insertion.insertBlock();
insertion.insertHtml("<HR>");
insertion.insertBlock();
insertion.insertText("baz");

qDebug() << textdoc->toHtml();

这样做的结果真的很奇怪。这是一个屏幕截图:

在此处输入图像描述

如您所见,我请求了两个<HR>标签,但我得到了五个水平规则!QTextDocument 的 HTML 也很奇怪(我添加了几个换行符以使其更具可读性):

<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">
<html>
<head><meta name=\"qrichtext\" content=\"1\" />
<style type=\"text/css\">
p, li { white-space: pre-wrap; }
</style></head>
<body style=\" font-family:'.SF NS Text'; font-size:13pt; font-weight:400; font-style:normal;\">
<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">foo</p>
<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">bar</p>
<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">baz</p>
</body></html>

<HR>HTML 中根本没有我的标签的迹象。使用稍微不同的策略——insertBlock()只在<HR>插入之前调用,或者只在它们之后调用,或者根本不调用——我得到了这个主题的变化;有时bar并且baz在 HTML 输出中不可见,但大量的<HR>标签却是。例如,如果我将插入代码更改为:

insertion.insertText("foo");
//insertion.insertBlock();
insertion.insertHtml("<HR>");
insertion.insertBlock();
insertion.insertText("bar");
//insertion.insertBlock();
insertion.insertHtml("<HR>");
insertion.insertBlock();
insertion.insertText("baz");

然后我得到一个结果,在我的应用程序的可见渲染中有四个水平规则,并且有这个 HTML 输出:

<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">
<html><head><meta name=\"qrichtext\" content=\"1\" />
<style type=\"text/css\">
p, li { white-space: pre-wrap; }
</style></head>
<body style=\" font-family:'.SF NS Text'; font-size:13pt; font-weight:400; font-style:normal;\">
<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">foo</p>
<hr />
<hr />
<hr />
<hr />
</body></html>

请注意barbaz在 HTML 输出中不可见,尽管它们在应用程序中呈现可见。

但是,在我发现的代码中,我没有得到我想要的东西。看起来我正在QTextDocument进入某种内部不一致或混乱的状态。那么:这样做的正确方法是什么?

这是 macOS 10.14.6 上的 Qt 5.9.8。

4

1 回答 1

0

我找到了一种似乎可以接受的解决方法,尽管它不是最佳的。在每个文本片段之间,我现在这样做:

insertion.insertBlock(hrBlockFormat);
insertion.insertText("––––––––––––––––––––");
insertion.insertBlock(defaultBlockFormat);

该字符串是一系列短划线(选项连字符,在 macOS 上)。它们QTextEdit在公认。但是,水平线的宽度不会填满视图;它仅由您使用的破折号数量决定,这很糟糕。此外,此解决方案当然会在 HTML 中生成一系列破折号,而不是<HR>; 我碰巧不在乎,但总的来说它也不是最佳的。

块格式设置如下:

QTextBlockFormat defaultBlockFormat;
QTextBlockFormat hrBlockFormat;
hrBlockFormat.setTopMargin(10.0);
hrBlockFormat.setBottomMargin(10.0);
hrBlockFormat.setAlignment(Qt::AlignHCenter);

这使水平规则居中,并在其周围提供了一些垂直空间。

于 2019-11-23T20:25:18.300 回答