在QTextEdit中设置行间距

时间:2012-04-20 17:08:04

标签: c++ qt

我想设置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);
        }
    }
}

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

将块格式应用于整个文档而不是每一行。

QTextBlockFormat bf = this->textCursor().blockFormat();
bf.setLineHeight(lineSpacing, QTextBlockFormat::LineDistanceHeight) ;
this->textCursor().setBlockFormat(bf);

答案 2 :(得分:0)

我知道这是一个老问题,但我今天花了很多时间试图为 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)