2011-09-16 32 views
8

Tôi có một widget để chèn trông giống nhưTìm chiều cao của một QWidget trước khi chèn

+--------------------+ 
| +-------++-------+ | 
| |  ||  | | 
| |  ||  | | 
| |  || Label | | 
| | Label || Label | | 
| |  ||  | | 
| |  ||  | | 
| +-------++-------+ | 
+--------------------+ 

yếu tố Một QWidget này chứa hai QVBoxLayouts, mỗi có chứa một hoặc nhiều QLabels.
Widget này sẽ được chèn vào trong Bố cục dọc có ô giãn, vì vậy tất cả các tiện ích con của loại này sẽ chuyển lên trên cùng và thu nhỏ xuống chiều cao nhỏ hơn có thể.

Kết quả như thế này.

______________________ ← Layout boundary 
+--------------------+ 
| +-------++-------+ | 
| |  || Label | | 
| | Label || Label | | ← Widget shrunk to the smallest 
| +-------++-------+ | 
+--------------------+ 
______________________ ← Layout boundary 
      ↑ 
      | 
      | ← Spacer 
      | 
      ↓ 
______________________ ← Layout boundary 

Nhưng trước khi thực hiện việc chèn này, tôi muốn biết kích thước mà tiện ích sẽ có trong bố cục được chèn. Có thể kích thước tối thiểu cho phép bởi bố cục bên trong của nó. Không chắc chắn làm thế nào để gọi nó.

Tôi đã thử nhiều cách tiếp cận như chèn tiện ích vào bố cục vô hình thay thế để tôi có thể truy xuất chiều cao của nó khi được chèn, sẽ giống như khi tiện ích được chèn vào bố cục dứt khoát của tôi.

Nhưng vì một lý do nào đó tôi luôn nhận được 480 hoặc 478 khi tiện ích ở độ cao tối đa 50px khi được nhấn theo chiều dọc. Vì vậy, tôi hoàn toàn bị mất.

Tôi phải làm điều này vì tôi cần tiện ích để tạo hiệu ứng khi chèn và tôi cần biết chiều cao cần thiết để tôi tạo hiệu ứng động từ độ cao 1 lên đó.

Tôi làm cách nào để thực hiện việc này?

+1

Không có biểu đồ cực kỳ có liên quan, nhưng tuyệt vời;) – Blender

+1

Bạn đã thử QLayout :: minimumSize() cho bố cục nội thất widget? – Robin

Trả lời

6

Nếu không có mã chính xác, thật khó để nói chắc chắn, nhưng khi chỉ cố gắng để tái tạo ví dụ của bạn, từ mô tả ở trên, tôi muốn đề nghị xem xét những điều sau đây:

  1. Nghe có vẻ như bạn đang thực sự gọi widget->height() trước khi tiện ích con được hiển thị. Thay vào đó, hãy thử gọi số widget->sizeHint().height(). Phương thức QWidget::sizeHint() cho bạn biết kích thước của tiện ích con nào là giống như là, nếu hình dạng gốc không đặt bất kỳ ràng buộc nào khác trên đó.

  2. Nếu bạn đang nhận được sizeHint() và vẫn nhận được câu trả lời sai, hãy xem tài liệu cho QWidget::ensurePolished(). Tôi tin rằng điều quan trọng là phải gọi điều này, để có được hình dạng chính xác hơn cho các tiện ích chưa được hiển thị:

    QWidget gọi chức năng này sau khi nó được xây dựng hoàn chỉnh nhưng trước khi nó được hiển thị lần đầu tiên. Bạn có thể gọi hàm này nếu bạn muốn đảm bảo rằng tiện ích được đánh bóng trước khi thực hiện một thao tác, ví dụ: kích thước phông chữ chính xác có thể cần thiết trong quá trình thực hiện lại sizeHint() của tiện ích con.

  3. Và nếu bạn vẫn gặp vấn đề, sau đó có một cái nhìn tại các tài liệu cho QWidget::sizePolicy(), và lớp QSizePolicy Class Reference. Tôi phải thừa nhận rằng tuy nhiên nhiều lần tôi đọc các tài liệu trên enum QSizePolicy::Policy, họ không bao giờ tất cả chìm vào. Nó thực sự dễ dàng để có một giá trị chính sách kích thước không chính xác mess lên bố trí của bạn.

    Có thể thử nghiệm với các chính sách kích thước khác nhau trong Qt Designer, trước khi áp dụng chính sách kích thước.

+0

+1 - chiều cao 480 gần như chắc chắn vì nó chưa bao giờ được hiển thị. SizeHint(). Height() hoặc layout-> minimumSize(). Height() cả hai sẽ trả lại giá trị đúng ngay cả trước khi hiển thị –

+0

Tôi đã giải quyết vấn đề này khoảng một giờ sau khi đăng bài, nhưng theo một cách rất xấu xí ... hiển thị () ing, nhận chiều cao và sau đó ẩn() ing. Cách của bạn hoạt động tốt hơn nhiều, tôi đã thử nó đã và đang hoạt động. Ban đầu tôi đã truy cập với '-> geometry.height();' có vẻ giống như cái bạn đoán tôi đang sử dụng. Lời chào hỏi. – Ale

+0

Tuyệt vời - vui lòng trợ giúp! –

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