2010-09-21 39 views
9

Điều tôi đang cố gắng đạt được là tiện ích có thể tồn tại ở hai bố cục khác nhau, trong trường hợp này là QHBoxLayout và trong QVBoxLayout. Tôi đang triển khai hệ thống tự động chuyển đổi giữa hai bố cục khi hướng màn hình của thiết bị thay đổi.Qt: Cùng một tiện ích bên trong hai bố trí khác nhau

Hiện nay tôi đang tạo ra, chúng ta hãy nói một widget tổng hợp phức tạp gọi là MyWidget và thêm nó vào một hai bố trí khác nhau:

MyWidget *wgt = new QWidget(); 
QVBoxLayout vlayout; 
QHBoxLayout hlayout; 

vlayout->addWidget(wgt); 
hlayout->addWidget(wgt); 

Bây giờ tưởng tượng rằng cả hai bố trí được lưu trữ trong một 'root' bố trí, và rằng bố cục gốc này có thể thay đổi kích thước thành chế độ 'ngang' cao hơn và cao hơn chế độ 'chân dung' rộng hơn.

MyWidget hiển thị chính xác chỉ trong bố cục đầu tiên được thêm vào và khi bố cục được chuyển, nó hiển thị tất cả sai hoặc không hoàn toàn.

Tôi không biết mình có ý nghĩa gì không, nhưng đây là vấn đề của tôi. Có lẽ khi sự kiện chuyển đổi được gọi là tất cả các tiện ích con và bố cục nên được thay đổi kích thước, vì vậy nó sẽ luôn luôn đúng. Chỉ có vấn đề là tôi không biết làm thế nào.

+0

câu hỏi liên quan: http://stackoverflow.com/questions/2990283/qt-change-qwidget-layout – rubenvb

Trả lời

4

Điều này không dễ làm, nhưng có thể.

Trước hết, tôi khuyên bạn nên thực sự tạo hai tiện ích con khác nhau, một cho ngành dọc và một cho ngang và quản lý mọi thứ theo cách đó. Nếu dữ liệu nguồn được tách riêng khỏi lớp UI, bạn sẽ có thể làm như vậy mà không gặp quá nhiều rắc rối, nhưng bằng cách phát sinh một số phí trên bộ nhớ.

Một cách để làm như bạn mong muốn là hoàn toàn remove the widgets từ một bố cục và thêm chúng vào vị trí khác khi bạn cần thay đổi sắp xếp trên màn hình và thay đổi bố cục được thêm vào tiện ích. Điều này sẽ khiến các vật dụng giống nhau được vẽ theo một cách khác.

Một cách xử lý khác nhau, phức tạp hơn (mặc dù có khả năng hiệu quả hơn) sẽ là write your own layout và có xử lý sắp xếp lại các tiện ích dựa trên thay đổi định hướng.

+1

tôi quyết định viết một phương pháp mà được tự động gọi khi thay đổi định hướng, mà (sau khi xoá) cho biết thêm các tiện ích một lần nữa vào bố cục. – Gerstmann

12

Đây không phải là giải pháp chung để thay đổi bố cục, mà là giải pháp dễ dàng trong trường hợp của bạn: Chỉ cần thay đổi hướng đi của boxlayout.

hlayout->setDirection(QBoxLayout::TopToBottom); 
// now your hboxlayout works as vertical layout 

hlayout->setDirection(QBoxLayout::LeftToRight); 
// and now it is horizontal again 
Các vấn đề liên quan