Мне просто нужно знать, как изменить размер вкладки в Qt в QTextEdit. Мой гугл и переполнение стека поиск вернул мне ноль. Заранее спасибо.
Если вы хотите создать редактор исходного кода, используя 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(' '));
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));
Вычисление произведения размером один пробел и число пробелов не всегда является точным (проверено в 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));