Как переопределить ширину табуляции в qt? - программирование
Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Если вы хотите создать редактор исходного кода с помощью 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(' '));

Ответ 2

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

Ответ 3

В то время как решение @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));

Ответ 4

Вычисление произведения размером в один пробел и числовое пространство не всегда точное (проверено под шрифтом 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));