2012-12-31 38 views
5

Tôi có tiện ích con tùy chỉnh có bố cục tổng thể của QVBoxLayout. Nó chứa một số nhãn, một QFormLayout, một nút, và một căng để ăn tất cả không gian dư thừa. Một trong các nhãn có thể khá lớn vì vậy tôi đang cố gắng đảm bảo rằng không có trường hợp kỳ lạ nào mà văn bản không thể đọc được. Widget được chứa trong QScrollArea để đảm bảo rằng nếu người dùng co lại cửa sổ tổng thể, tất cả các khía cạnh của widget vẫn có thể được nhìn thấy.Cắt nhãn văn bản để đổi kích thước

QLabel xuất hiện để thay đổi kích thước, nhưng khi nó đạt đến một điểm hẹp nhất định, nó chỉ cắt bớt một vài dòng dưới cùng của nhãn và phân bổ khoảng trống cho phần cuối của tiện ích.

Tôi đang làm điều này tất cả trong mã mà không có Nhà thiết kế, vì vậy hoàn toàn có thể là tôi chỉ thiếu một cái gì đó. Các thành phần phụ được thêm vào QVBoxLayout tổng thể theo trình tự sau:

OverallLayout = new QVBoxLayout(this); 
Title   = new QLabel(); 
Description = new QLabel(); 
SubRegion  = new QFormLayout(); 
Button  = new QButton(); 
... 
// set text values, wordWrap(true), and Font for labels 
OverallLayout->addWidget(Title); 
OverallLayout->addWidget(Description); 
OverallLayout->addLayout(SubRegion); 
OverallLayout->addStrut(MIN_DIST); 
OverallLayout->addWidget(Button); 
OverallLayout->addStretch(STRETCH_FACTOR); 

Kết quả thử nghiệm: Kiểm tra các kết quả trả về từ QLabel của sizeHint() chức năng, các giá trị trả dường như không thay đổi khi các phụ tùng được thu nhỏ theo chiều ngang. Tuy nhiên, QLabel không mở rộng để chiếm nhiều chỗ đứng hơn (153 so với gợi ý 103), chỉ là không đủ để phù hợp với tất cả văn bản. Khi QLabel được hiển thị lần đầu tiên, nó có ít pixel hơn sizeHint nhưng vẫn đủ cho chiều cao heightForWidth của nó. Khi nó được thay đổi kích thước, nó có 30 ít hơn chiều cao heightForWidth của nó nhưng nhiều hơn sizeHint của nó.

Tôi đã kiểm tra và QLabel lớn có giá trị hasHeightForWidth() và wordWrap() được đặt thành true. Tôi đang làm gì sai?

+0

Bạn có thể thêm đoạn mã nơi các tiện ích này đang được thêm vào bố cục không? Tôi nghĩ rằng bạn nên thiết lập kích thước tối thiểu của QLabel bởi setMinimumHeight() để không có cut-off. Ngoài ra, bạn có thể đặt giá trị độ cao tối đa cho phần tử bộ đệm. –

+0

Một cách tôi nghĩ đến việc sửa chữa nó là liên kết đến phương pháp đã thay đổi kích cỡ và có chiều cao tối thiểu được đặt thành giá trị heightForWidth (chiều rộng) cho nhãn Mô tả. Điều này có vẻ như một chút kludgey mặc dù, vì vậy tôi đã tự hỏi những gì đúng cách để có được người quản lý bố trí để làm công việc của mình sẽ được. – ElCraneo

+0

Nhưng còn đề xuất sử dụng 'setMinimumHeight()' thì sao? – jdi

Trả lời

2

Tôi đã kết thúc bằng phương pháp ghi đè hàm resizeEvent(QResizeEvent *evt) của tiện ích để đặt giá trị tối đa của QLabel động.

void MyWidget::resizeEvent (QResizeEvent *evt) { 
    int newHeight = Description.heightForWidth(Description.width()); 
    Description.setMaximumHeight(newHeight); 
    QWidget::resizeEvent(evt); 
    // Note: I'm not sure if this last step is necessary 
} 

Một item thú vị cần lưu ý là nếu bạn làm cả hai setMinimumHeight(newHeight)setMaximumHeight(newHeight) nhãn sẽ phát triển theo chiều dọc để phù hợp với văn bản nhưng nó sẽ không bao giờ thu nhỏ khi nhãn phát triển theo chiều ngang và không cần thêm không gian. Tôi đoán là heightForWidth(int w) trả về giá trị tối đa giữa giá trị tối thiểu của tiện ích và các pixel thực sự cần. Phần lẻ là nó dường như không quan tâm đến việc trả về một giá trị lớn hơn giá trị tối đa hiện tại.

Các vấn đề liên quan