在 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 中设置行距的主要内容,如果未能解决你的问题,请参考以下文章

QTextedit 设置锚点并滚动到它

如何使用 Pango 在 Clutter.Text 中设置行高

Axure基础入门

如何在word中设置图片边距

Qt4 现有插槽无法识别

word2010插入公式以后无法调整公式左对齐、居中、右对齐等等,如何解决?