在 QTextEdit 中设置行距
Posted
技术标签:
【中文标题】在 QTextEdit 中设置行距【英文标题】:Set line spacing in QTextEdit 【发布时间】:2012-04-20 17:08:03 【问题描述】:我想设置 QTextEdit 的行距。
用
获取这些信息是没有问题的QFontMetrics::lineSpacing();
但是如何设置呢?
我尝试过使用 StyleSheets,但没有奏效:
this->setStyleSheet("QTextEdit height: 200%; ");
或
this->setStyleSheet("QTextEdit line-height: 200%; ");
部分解决方案:
好吧,我找到了一个解决方案 - 不是我想要的方式,但至少它很简单,并且它几乎提供了我预期的行为,足以用于我的概念证明。
在每个新行上都有一些行距。但是,如果您只是键入直到文本自动换行到新行,则这两行之间不会有行距。此 hack 仅适用于文本块,请参阅代码。
请记住,这是蛮力和丑陋的黑客攻击。但它为您漂亮的 QTextEdit 提供了某种行距。每次文本更改时调用它。
void setLineSpacing(int lineSpacing)
int lineCount = 0;
for (QTextBlock block = this->document()->begin(); block.isValid();
block = block.next(), ++lineCount)
QTextCursor tc = QTextCursor(block);
QTextBlockFormat fmt = block.blockFormat();
if (fmt.topMargin() != lineSpacing
|| fmt.bottomMargin() != lineSpacing)
fmt.setTopMargin(lineSpacing);
//fmt.setBottomMargin(lineSpacing);
tc.setBlockFormat(fmt);
【问题讨论】:
不过,一个好的解决方案会很有趣。 【参考方案1】:QFontMetrics 包含(根据名称)来自字体文件的静态属性。大写“C”的宽度等。lineSpacing()
为您提供设计字体的人编码到字体本身的单间距自然距离。如果你真的想改变那个(你不想)......这里讲述的有点复杂的故事:
http://fontforge.sourceforge.net/faq.html#linespace
至于 QTextEdit 中的行间距...(在我看来)它被视为 Qt 用于指定文本“布局”的可扩展性模型中的一项内容:
http://doc.qt.io/qt-4.8/richtext-layouts.html
您将向 QTextDocument 提供您自己的布局类,而不是使用默认值。有人在这里尝试过,但没有发布他们完成的代码:
http://www.qtcentre.org/threads/4198-QTextEdit-with-custom-space-between-lines
【讨论】:
见鬼,为什么我没有绊倒呢?我马上试试。 :) 好的,绘制静态文本很容易。但是在 QTextEdit 中将该布局设置为可编辑文本会遇到一些困难。 不足为奇。您可以尝试从源代码为 Qt 版本的默认 QTextLayout 工作,也许从它继承并覆盖您认为需要的位?在 4.7 中是:qt.gitorious.org/qt/qt/blobs/4.7/src/gui/text/qtextlayout.cpp 即使我已经构建了我的 QTextLayout 版本,我也不知道如何将它应用到我的 QTextEdit。好像我必须通过一些 QTextDocument 和其他抽象布局......myTextEdit->document()->setDocumentLayout(myLayout);
??【参考方案2】:
将块格式应用于整个文档而不是每一行都有效。
QTextBlockFormat bf = this->textCursor().blockFormat();
bf.setLineHeight(lineSpacing, QTextBlockFormat::LineDistanceHeight) ;
this->textCursor().setBlockFormat(bf);
【讨论】:
【参考方案3】:我知道这是一个老问题,但我今天花了很多时间试图为 PyQt5 5.15.2 解决这个问题。我发布我的解决方案以防它对其他人有用。该解决方案适用于 Python,但应该易于移植。
以下代码将一次性将填充的 QTextEdit 小部件的行高更改为 150%。进一步的编辑将选择当前的块格式,并继续应用它。不过,我发现它对于大型文档来说非常慢。
textEdit = QTextEdit()
# ... load text into widget here ...
blockFmt = QTextBlockFormat()
blockFmt.setLineHeight(150, QTextBlockFormat.ProportionalHeight)
theCursor = textEdit.textCursor()
theCursor.clearSelection()
theCursor.select(QTextCursor.Document)
theCursor.mergeBlockFormat(blockFmt)
【讨论】:
【参考方案4】:我已经将Jadzia626 的代码翻译成C++ 并且可以正常工作。这里是关于setLineHeight()
的信息
qreal lineSpacing = 35;
QTextCursor textCursor = ui->textBrowser->textCursor();
QTextBlockFormat * newFormat = new QTextBlockFormat();
textCursor.clearSelection();
textCursor.select(QTextCursor::Document);
newFormat->setLineHeight(lineSpacing, QTextBlockFormat::ProportionalHeight);
textCursor.setBlockFormat(*newFormat);
【讨论】:
以上是关于在 QTextEdit 中设置行距的主要内容,如果未能解决你的问题,请参考以下文章