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

Мне просто нужно знать, как изменить размер вкладки в Qt в QTextEdit. Мой гугл и переполнение стека поиск вернул мне ноль. Заранее спасибо.

16

Решение

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

Другие решения

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

8

Хотя решение @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));
1
По вопросам рекламы [email protected]