Как переопределить ширину вкладки в 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));