2011-07-03 48 views
22

Tôi đang cố gắng đặt QVBoxLayout bên trong QScrollArea để có thể cuộn theo chiều dọc. Tuy nhiên các mục dường như không được thêm vào nó.Cách tạo QVBoxLayout có thể cuộn?

Tôi thấy một gợi ý rằng tôi nên tạo một widget bên trong mà ScrollArea sử dụng và đặt bố cục bên trong, mặc dù nó dường như không hoạt động. Cấu trúc của tôi có nghĩa vụ phải trông như thế này:

+------------------------------- 
| QScrollArea(realmScroll) 
| +---------------------------- 
| | QWidget(realmScrollInner) 
| | +------------------------- 
| | | QVBoxLayout(realmLayout) 

Và mã để làm điều này:

# Irrelevant, added for context (this works) 
centralWidget = QWidget(self) 
self.container = QVBoxLayout(centralWidget) 
centralWidget.setLayout(self.container) 
self.setCentralWidget(centralWidget) 

# Where trouble starts 
self.realmScroll = QScrollArea(self.container.widget()) 
self.realmScroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) 

self.realmLayout = QVBoxLayout(self.container.widget()) 

self.realmScrollInner = QWidget(self.realmScroll) 
self.realmScrollInner.setLayout(self.realmLayout) 

self.realmScroll.setWidget(self.realmScrollInner) 
self.container.addWidget(self.realmScroll) 

# Doesn't add to realmLayout 
self.realmLayout.addWidget(QLabel("test")) 

tôi vẫn đang học Qt (trong 2 ngày), vì vậy trong sâu câu trả lời cho nơi tôi sai lầm sẽ được đánh giá cao.

Cập nhật:

Dường như addWidget(QLabel()) công trình phải lên cho đến khi realmScrollInner đã được thiết lập như realmScroll 's widget. Kể từ khi tôi muốn thêm các yếu tố sau giao diện người dùng đã được hiển thị tôi phải làm điều này, điều mà tôi không chắc chắn là thực sự đúng:

self.realmLayout.addWidget(QLabel("test")) 

# realmScrollInner bound to realmScroll 
realmScroll.setWidget(realmScrollInner) 
self.container.addWidget(realmScroll) 

# Access realmScroll's widget and then layout to add 
realmScroll.widget().layout().addWidget(QLabel("test")) 

Nhưng nếu bạn loại bỏ cuộc gọi đầu tiên để addWidget trước widget có bị ràng buộc (do đó bố cục không có tiện ích con), sau đó liên kết với các tiện ích ScrollArea được thêm vào sau đó sẽ không được hiển thị. Có lẽ ScrollArea cần sơn lại (mặc dù tôi không thấy một phương pháp cho điều đó)?

Cập nhật 2: Gọi repaint() trên realmScroll hoặc tiện ích con được chứa không có gì, cũng như gọi activate/update() trên bố cục.

Trả lời

2

thử gọi

self.realmScroll.setWidgetResizable(True) 
8

Hóa ra là tôi đang dẫn xuống một con đường sai lầm bằng cách đặt cách bố trí như cách bố trí của một widget. Cách thực tế để thực hiện việc này đơn giản như:

scrollarea = QScrollArea(parent.widget()) 
layout = QVBoxLayout(scrollarea) 
realmScroll.setWidget(layout.widget()) 

layout.addWidget(QLabel("Test")) 

Tôi chắc chắn rằng tôi đã thử ban đầu, nhưng nó hoạt động tốt.

Tuy nhiên điều này thêm một vấn đề là các mục của bố cục bị thu hẹp theo chiều dọc thay vì làm cho vùng cuộn chuột thêm thanh cuộn.

+0

Tôi chỉ có một vấn đề rất giống với vấn đề này; xem giải pháp tại đây: http://stackoverflow.com/q/12781407/432913 – will

6

OK, tôi vừa làm xong việc này. Đây là một tiện ích có thể đi vào vùng cuộn (scrollarea-> setWidget) và hoạt động chính xác. Nó chứa một QVBoxLayout và một danh sách các cặp nhãn/listwidget, mỗi cặp trong bố trí ngang nhỏ của riêng mình, và nó thực hiện khá nhiều những gì bạn muốn.

Điều quan trọng là đọc phần tài liệu QScrollArea về Kích thước gợi ý và bố cục và tìm bit có sizeContraint QLayout :: SetMinAndMaxSize trên bố cục là cần thiết.

class MappingDisplayWidget : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit MappingDisplayWidget(QWidget *parent = 0); 
    void addFile(QString name); 
private: 
    QVBoxLayout *m_layout; 
    QMap<QString, QListWidget *> m_mappings; 
}; 


MappingDisplayWidget::MappingDisplayWidget(QWidget *parent) : 
    QWidget(parent) 
{ 
    m_layout = new QVBoxLayout; 
    m_layout->setSizeConstraint(QLayout::SetMinAndMaxSize); 
    setLayout(m_layout); 
} 


void MappingDisplayWidget::addFile(QString name) { 
    if (m_mappings.find(name) == m_mappings.end()) { 
     QWidget *widg = new QWidget; 

     QHBoxLayout *lay = new QHBoxLayout; 
     widg->setLayout(lay); 

     QLabel *nlab = new QLabel(name); 
     lay->addWidget(nlab); 

     QListWidget *list = new QListWidget; 
     lay->addWidget(list); 

     m_layout->addWidget(widg); 

     m_mappings[name] = list; 
    } 
} 

Tôi giữ con trỏ đến tiện ích danh sách để tôi có thể thêm công cụ cho chúng sau này và hoạt động tốt.

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