Po prostu muszę wiedzieć, jak zmienić rozmiar tabulatora w Qt w QTextEdit. Moje wyszukiwanie Google i stackoverflow zwróciło mi wartość null. Z góry dziękuję.Jak zastąpić szerokość karty w qt?
Odpowiedz
Jeśli chcesz stworzyć edytor kodu źródłowego za pomocą QTextEdit
, należy najpierw przypisać stałej szerokości (stałej szerokości) czcionki. To gwarantuje, że wszystkie znaki mają taką samą szerokość:
QFont font;
font.setFamily("Courier");
font.setStyleHint(QFont::Monospace);
font.setFixedPitch(true);
font.setPointSize(10);
QTextEdit* editor = new QTextEdit();
editor->setFont(font);
Jeśli chcesz ustawić szerokość zakładki do pewnej ilości przestrzeni, jak to jest zazwyczaj wykonywane w edytorach tekstowych, użyj QFontMetrics
obliczyć wielkość jednej przestrzeni w pikseli:
const int tabStop = 4; // 4 characters
QFontMetrics metrics(font);
editor->setTabStopWidth(tabStop * metrics.width(' '));
Obiekt QTextEdit::tabStopWidth
może rozwiązać problem (patrz here Dokumentacji ...)
dziękuję za odpowiedź, aby spróbować. Ustawię TabStopWidth na 40, więc to zmieniło mój rozmiar tabulatora. Ale odpowiada 11 spacji i 5 znaków. Dlaczego wszystkie znaki mają różne rozmiary? Chcę, aby mój redaktor zachowywał się jak redaktorzy kodu źródłowego. Czego mi brakuje? –
Używaj czcionek o stałej szerokości, takich jak Courier New, a wszystkie twoje znaki będą miały tę samą szerokość. – JonathanK
obliczeniowe produkt o wielkości jednej przestrzeni i num przestrzeni nie zawsze jest dokładny (testowane pod MacOS, czcionki Monako), prawdopodobnie ze względu na pewne luki pomiędzy postaciami w rzeczywistym łańcucha. Lepszym rozwiązaniem byłoby, aby zmierzyć długość łańcucha zawierającego spacje 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));
Choć rozwiązanie @Ferdinand Beyer będzie działać w niektórych systemach, na ogół czcionki nie są gwarantowane mieć metryki całkowite. np. 12pt DejaVu Sans Mono
w mojej konfiguracji Linuksa ma szerokość znaku równą 9,625. Najlepszym rozwiązaniem, jakie znalazłem, jest dodanie odstępów między literami, aby uzyskać idealne dopasowanie w pikselach.
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));
Co powiesz na właściwość 'tabStopWidth'? http://doc.qt.digia.com/qt/qtextedit.html#tabStopWidth-prop – fasked