2012-10-23 24 views

Odpowiedz

24

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(' ')); 
8

Obiekt QTextEdit::tabStopWidth może rozwiązać problem (patrz here Dokumentacji ...)

+1

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? –

+0

Używaj czcionek o stałej szerokości, takich jak Courier New, a wszystkie twoje znaki będą miały tę samą szerokość. – JonathanK

1

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)); 
2

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));