Как переопределить ширину вкладки в qt?

Мне просто нужно знать, как изменить размер вкладки в Qt в QTextEdit. Мои Google и stackoverflow поиск вернул мне null. Спасибо заранее.

4 ответов


если вы хотите создать редактор исходного кода с помощью QTextEdit, вы должны сначала назначить шрифт фиксированной ширины (monospace). Это гарантирует, что все символы имеют одинаковую ширину:

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(' '));

на QTextEdit::tabStopWidth свойство может решить вашу проблему (см. здесь для документации...)


хотя решение @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));

вычисление произведения размера одного пространства и Num-пространств не всегда точно (проверено в macOS, Monaco font), предположительно из-за некоторых пробелов между символами в реальной строке. Лучшим решением будет измерить длину строки, содержащей остановка табуляции пробелами:

const int tabStop = 4;  // 4 characters

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

QFontMetrics metrics(font);
editor->setTabStopWidth(metrics.width(spaces));