2012-12-05 41 views
17

Tôi muốn có một phiên bản QWidget sử dụng QHBoxLayout và (lý tưởng tự động, nhưng khi gọi một số chức năng cũng được) thay đổi kích thước theo chiều ngang để phù hợp với nội dung của nó. Thay đổi kích thước theo chiều ngang là đủ vì tất cả các tiện ích, bao gồm cả vùng chứa, sẽ có cùng chiều cao.Tiện ích Qt với kích thước tối thiểu để phù hợp với tất cả nội dung

Trường hợp sử dụng như sau: Tiện ích con, hãy gọi nó là vùng chứa, đang nổi, tức là không phải là một phần của bố cục bất kỳ. Người dùng có thể thêm các tiện ích con khác với kích thước cố định (bằng cách gọi hàm) đến bố cục của vùng chứa, khi vùng chứa phát triển để phù hợp với nội dung mới của nó. Người dùng cũng có thể xóa tiện ích đã thêm trước đó, khi đó vùng chứa sẽ co lại. Vùng chứa sẽ không được tạo cho đến khi tiện ích đầu tiên được chèn và xóa khi tiện ích con cuối cùng bị xóa, tức là nó sẽ luôn chứa ít nhất một tiện ích.

Một ví dụ: sau khi thêm widget đầu tiên, container trông như thế này, với | là trái/biên giới quyền của mình:

|<1st widget>| 

Sau khi thêm một khác, nó trông như thế này:

|<1st widget> <2nd, longer widget>| 

Sau khi loại bỏ các widget đầu tiên, nó trông như thế này:

|<2nd, longer widget>| 

Tôi nghi ngờ rằng điều này nên đơn giản, nhưng tôi đã mất một nơi nào đó giữa các container sizeHint, sizePolicy, adjustSize() và bố cục của nó là sizeContraint cũng như một số lần thử thiết lập kích thước và buộc cập nhật và về cơ bản không có nơi nào (tức là các container không thay đổi kích thước ở tất cả, container chỉ phát triển nhưng không co lại, vv). Tôi nghi ngờ rằng tôi đã phải bỏ lỡ một cái gì đó hiển nhiên ..?

Trả lời

8

Đoán của bạn là đúng. Người ta phải đặt chính sách kích thước cho các tiện ích trong bố cục. Tiện ích đầu tiên phải có QSizePolicy::Minimum và tiện ích thứ hai cần có QSizePolicy::Expanding để đạt được hiệu quả mong muốn. Đây là một ứng dụng mẫu:

#include <QtGui> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QPushButton *button1 = new QPushButton("Hello"); 
    button1->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); 
    QObject::connect(button1, SIGNAL(clicked(bool)), button1, SLOT(hide())); 
    QPushButton *button2 = new QPushButton("World"); 
    button2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); 
    QObject::connect(button2, SIGNAL(clicked(bool)), button2, SLOT(hide())); 

    QHBoxLayout *layout = new QHBoxLayout(); 
    layout->addWidget(button1); 
    layout->addWidget(button2); 

    QWidget main; 
    main.setLayout(layout); 
    main.show(); 

    return a.exec(); 
} 
Các vấn đề liên quan