20

我只需要知道如何在QTextEdit中更改 Qt 中的选项卡大小。我的 Google 和stackoverflow搜索返回 null。提前致谢。

4

5 回答 5

39

如果您想使用 来创建源代码编辑器QTextEdit,您应该首先指定一个固定宽度(等宽)字体。这确保所有字符具有相同的宽度:

QFont font;
font.setFamily("Courier");
font.setStyleHint(QFont::Monospace);
font.setFixedPitch(true);
font.setPointSize(10);

QTextEdit* editor = new QTextEdit();
editor->setFont(font);

如果您想将制表符宽度设置为一定数量的空格(通常在文本编辑器中完成),请使用QFontMetrics以像素为单位计算一个空格的大小:

const int tabStop = 4;  // 4 characters

QFontMetrics metrics(font);
editor->setTabStopWidth(tabStop * metrics.width(' '));
于 2013-03-06T12:22:31.080 回答
8

QTextEdit::tabStopWidth属性可能会解决您的问题(请参阅此处获取文档...)

于 2012-10-23T09:17:42.803 回答
6

虽然关于如何设置制表位宽度的问题已经得到解答;以像素为单位计算正确的标签宽度仍然是(或再次?)一个悬而未决的问题。

Qt 5.10起,QTextEdit::tabStopWidth被标记为过时QTextEdit::tabStopDistance并被引入。tabStopWidth是整数,tabStopDistancedouble

为什么这么复杂?

设置n * QFontMetrics::width(' ')为制表位宽度会带来麻烦,因为font_metrics.width返回一个整数。即使您有等宽标准字体,单个字符的宽度实际上也不是整数,因此QFontMetrics::width返回的度量值不准确。如果您比较字符串的外观........|\t\t\t\t|(\t = tab, n=2),您会发现管道没有正确对齐。您插入的标签越多,情况就会变得更糟。

解决方案

你可以按照@Ferdinand Beyer 的建议去做,但它会稍微改变字体。我还必须调整他的方法以使其发挥作用。但是,有一种更简单的方法可以利用,您tabStopDistance现在可以使用双精度设置:

static constexpr int tab_width_char = 2;
m_text_edit->setFont(QFont("Courier", 12));
const auto font_metrics = m_text_edit->fontMetrics();

static constexpr int big_number = 1000; // arbitrary big number.
const QString test_string(" ");

// compute the size of a char in double-precision
const int single_char_width = font_metrics.width(test_string);
const int many_char_width = font_metrics.width(test_string.repeated(big_number));
const double single_char_width_double = many_char_width / double(big_number);

// set the tab stop with double precision
m_text_edit->setTabStopDistance(tab_width_char * single_char_width_double);

如果 Qt 提供了一种将单个字符的宽度设为double.

于 2019-02-09T11:19:57.240 回答
5

虽然@Ferdinand Beyer 的解决方案适用于某些系统,但通常不保证字体具有整数度量。例如12pt DejaVu Sans Mono,在我的 Linux 设置中,字符宽度为 9.625。我发现的最佳解决方案是添加一些字母间距以获得像素完美对齐。

int tabstop = 4;

QFontMetricsF fm (ui->textEdit->font());
auto stopWidth = tabstop * fm.width(' ');
auto letterSpacing = (ceil(stopWidth) - stopWidth) / tabstop;

auto font = ui->textEdit->font();
font.setLetterSpacing(QFont::AbsoluteSpacing, letterSpacing);
ui->textEdit->setFont(font);

ui->textEdit->setTabStopWidth(ceil(stopWidth));
于 2017-02-06T15:51:16.277 回答
4

计算一个空格和 num 个空格大小的乘积并不总是精确的(在 macOS,Monaco 字体下测试),可能是由于实际字符串中的字符之间存在一些间隙。更好的解决方案是测量包含 tabStop 空格的字符串的长度:

const int tabStop = 4;  // 4 characters

QString spaces;
for (int i = 0; i < tabStop; ++i) {
    spaces += " ";
}

QFontMetrics metrics(font);
editor->setTabStopWidth(metrics.width(spaces));
于 2016-09-28T17:40:12.497 回答