我想把来自多个QTextDocumentFragment的QTextDocument放在一起,用<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的超文本标记语言也很奇怪(我添加了几个换行符,使其更具可读性):
<!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>在HTML语言中根本看不到我的<HR>标签。使用略微不同的策略-只在<HR>插入之前调用insertBlock(),或者只在它们之后调用,或者根本不调用-我得到了关于这个主题的变体;有时bar和baz在<HR>输出中不可见,但丰富的<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>请注意,bar和baz在HTML输出中不可见,尽管它们在应用程序中呈现可见。
但在我发现的代码中,我没有得到我想要的东西。看起来我让QTextDocument陷入了某种内部不一致或混乱的状态。那么:做这个的正确方法是什么?
这是macOS 10.14.6上的Qt 5.9.8。
发布于 2019-11-24 04:25:18
我发现了一个似乎可以接受的变通方法,尽管它不是最优的。在每个文本片段之间,我现在这样做:
insertion.insertBlock(hrBlockFormat);
insertion.insertText("––––––––––––––––––––");
insertion.insertBlock(defaultBlockFormat);该字符串是一系列连字符(在macOS上为-连字符选项)。它们在QTextEdit中清晰地显示为实线,字符之间没有分隔符,至少在我碰巧使用的字体中是这样,在macOS上等等。我不知道这个解决方案的可移植性如何,所以会接受一个更好的解决方案。然而,水平标尺的宽度并不会填满视图;它只是由您使用的虚线数量决定的,这很糟糕。此外,这种解决方案当然会在HTML中生成一系列的破折号,而不是<HR>;我碰巧并不关心这一点,但它通常也不是最优的。
块格式设置如下:
QTextBlockFormat defaultBlockFormat;
QTextBlockFormat hrBlockFormat;
hrBlockFormat.setTopMargin(10.0);
hrBlockFormat.setBottomMargin(10.0);
hrBlockFormat.setAlignment(Qt::AlignHCenter);这会使水平标尺居中,并在其周围提供一些垂直空间。
https://stackoverflow.com/questions/59009040
复制相似问题