Tôi chỉ cần biết cách thay đổi kích thước tab trong Qt trong một QTextEdit. Tìm kiếm của tôi trên Google và stackoverflow trả lại cho tôi giá trị rỗng. Cảm ơn trước.Cách ghi đè độ rộng của tab trong qt?
Trả lời
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(' '));
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 ...)
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? –
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
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));
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));
Thuộc tính 'tabStopWidth' như thế nào? http://doc.qt.digia.com/qt/qtextedit.html#tabStopWidth-prop – fasked