2012-10-23 40 views

Trả lời

24

Nếu bạn muốn tạo một trình soạn thảo mã nguồn sử dụng QTextEdit, trước tiên bạn nên gán một phông chữ (monospace) chiều rộng cố định. Điều này đảm bảo rằng tất cả các nhân vật đều có cùng chiều rộng:

QFont font; 
font.setFamily("Courier"); 
font.setStyleHint(QFont::Monospace); 
font.setFixedPitch(true); 
font.setPointSize(10); 

QTextEdit* editor = new QTextEdit(); 
editor->setFont(font); 

Nếu bạn muốn thiết lập chiều rộng tab để số tiền nhất định của không gian, vì nó thường được thực hiện trong soạn thảo văn bản, sử dụng QFontMetrics để tính toán kích thước của một không gian trong pixel:

const int tabStop = 4; // 4 characters 

QFontMetrics metrics(font); 
editor->setTabStopWidth(tabStop * metrics.width(' ')); 
8

Thuộc tính QTextEdit::tabStopWidth có thể giải quyết vấn đề của bạn (xem here cho Tài liệu ...)

+1

cảm ơn câu trả lời của bạn, để thử nó, tôi đặt TabStopWidth thành 40, vì vậy điều này đã thay đổi kích thước tab của tôi. Nhưng điều này tương ứng với 11 ký tự khoảng trắng và 5 ký tự. Tại sao tất cả các charachters có kích thước khác nhau? Tôi muốn trình soạn thảo của mình hoạt động như trình chỉnh sửa mã nguồn. Những gì tôi đang mất tích? –

+0

Sử dụng phông chữ đơn cách như Courier New và tất cả các ký tự của bạn sẽ có cùng chiều rộng. – JonathanK

1

Computing một sản phẩm có kích thước của một không gian vũ trụ và num là không phải lúc nào chính xác (kiểm tra trong hệ điều hành MacOS, Monaco phông chữ), có lẽ là do một số khoảng trống ở giữa các ký tự trong chuỗi thực. Một giải pháp tốt hơn là nên đo chiều dài của chuỗi chứa không gian 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

Trong khi giải pháp @Ferdinand Beyer sẽ làm việc trên một số hệ thống, thường là phông chữ không đảm bảo có số liệu số nguyên. ví dụ: 12pt DejaVu Sans Mono trên thiết lập Linux của tôi có độ rộng ký tự là 9.625. Giải pháp tốt nhất mà tôi tìm thấy là thêm khoảng cách giữa các chữ cái để căn chỉnh pixel hoàn hảo.

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)); 
Các vấn đề liên quan