我只需要知道如何在QTextEdit中更改Qt中的标签大小。我的Google和stackoverflow搜索将我返回null。提前谢谢。
答案 0 :(得分:31)
如果要使用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(' '));
答案 1 :(得分:8)
QTextEdit::tabStopWidth
属性可能会解决您的问题(请参阅here了解文档...)
答案 2 :(得分:5)
虽然@Ferdinand Beyer的解决方案适用于某些系统,但通常不保证字体具有整数指标。例如我的Linux设置12pt DejaVu Sans Mono
的字符宽度为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));
答案 3 :(得分:1)
计算大小为一个空格和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));
答案 4 :(得分:0)
关于如何设置制表位宽度的问题已经得到解答; 以像素为单位计算正确的制表符宽度仍然是(或再次是)一个悬而未决的问题。
由于 Qt 5.10 ,QTextEdit::tabStopWidth
被标记为过时,并且引入了QTextEdit::tabStopDistance
。 tabStopWidth
是整数,tabStopDistance
是double
。
将n * QFontMetrics::width(' ')
设置为制表符停止宽度会造成麻烦,因为font_metrics.width
返回一个整数。即使您使用的是等宽字体标准字体,单个字符的宽度实际上也不是整数,因此QFontMetrics::width
返回的度量不准确。
如果比较字符串........|
和\t\t\t\t|
的外观(\ t =制表符,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
的方法,这将变得更加简单。