Tôi đang gặp phải tất cả các vấn đề về kích thước với Qt. Tôi đang tạo các widget của riêng mình và sử dụng các bố cục khác nhau (nói chung, tôi cần riêng của mình để làm cho chúng hoạt động chính xác mà không cần phải bỏ ra hàng giờ trên các bố cục mặc định "mạnh" ... không được đặt ra như dự định.)Điều gì làm cho tiện ích Qt và bố cục của nó hoạt động đúng (liên quan đến kích thước của nó)?
Một khi tôi đã hoàn thành với một widget và layout của nó, nó không hoạt động đúng. Kích thước không bao giờ được đặt đúng cách trừ khi tôi gọi widget->resize(1, 1);
mà cuối cùng buộc phải "thay đổi kích thước" và làm cho tiện ích trông chính xác (tức là tính toán lại hình học.) Ngay cả cuộc gọi updateGeometry()
cũng không có hiệu lực.
Đây là vấn đề đáng sợ khi số resize()
cần được gọi trên tiện ích con (yuck!) Và từ những gì tôi đọc không cần thiết là bố cục được lập trình đúng cách.
Có mẫu nào hoạt động và không dài vài nghìn dòng hay Qt yêu cầu hàng nghìn dòng để làm cho mọi thứ hoạt động hoàn hảo, ngay cả tiện ích đơn giản nhất?
Các chức năng tối thiểu sẽ được gọi để tạo một widget & bố cục của nó hoạt động cùng một lúc là gì?
Cảm ơn bạn. Alexis
P.S. Tôi đã cố triển khai sizeHint()
, minimumSize()
, maximumSize()
, những người khác mà tôi bị thiếu? Tôi đã hy vọng rằng sẽ là đủ. Rõ ràng, tôi cũng thực hiện các setGeometry()
trên bố trí để thay đổi kích cỡ trẻ em một cách thích hợp.
--- thêm 1
Có một hình ảnh mẫu có bố cục rõ ràng không có sẵn như trong Qt. Các vị trí, chức năng và màu sắc của các khóa khác nhau được định hướng bằng XML và hoạt động với mọi bàn phím trên thế giới.
(lưu ý, mẫu này không hiển thị phím Enter hiển thị trên hai hàng và rộng hơn bên dưới hơn ở phía trên; nhiều hơn hoặc ít hơn, không thể thực hiện được ở tất cả với bố trí thường xuyên; tất nhiên, nó hoạt động với phiên bản của tôi.)
--- làm rõ
Tôi không chắc chắn cách mô tả vấn đề tốt hơn. Tôi đã suy nghĩ để viết một widget thử nghiệm bên cạnh để xem làm thế nào tôi có thể tái tạo các vấn đề và sau đó đăng bài đó và cuối cùng sửa chữa nó. 8-)
Chức năng bố cục mặc định mà bố cục Qt bên trong sử dụng yêu cầu nhiều mã hóa. Tôi muốn tránh phải sao chép/dán tất cả điều đó bởi vì để bảo trì, nó làm cho nó gần như không thể.
--- phát hiện ngày nay
Như tôi cần thiết để tinh chỉnh một trong những widget, tôi quyết định thêm một VBoxLayout
và làm cho nó làm việc.
Tôi thực sự đã tìm thấy sự cố ... Một trong những tiện ích trong cây của tôi là QScrollArea
và rằng sizeHint()
trả về (-1, -1). Không chính xác những gì tôi mong đợi nhưng ... bất cứ điều gì bạn đặt bên trong phụ tùng đó có tốt hơn biết làm thế nào để tính toán chiều rộng và chiều cao của nó hoặc người nào khác ... nó không thành công.
Nhìn mã chặt chẽ, tôi thực sự có thể tính toán chiều rộng bằng cách sử dụng chiều rộng rộng nhất được tìm thấy. Một khi tôi đã sử dụng, tiện ích sẽ xuất hiện (và nó thực sự thay đổi kích thước của nó như là những thứ thay đổi trong danh sách, rất tuyệt.)
Điều này đang được nói, nhận xét trước đây của tôi về việc có một vật dụng tự động thay đổi kích thước. Từ gốc đến cha mẹ của lá trong cây của bạn, tất cả những vật dụng đó sẽ cần bố cục hợp lệ. Một khi tôi thêm một trong những phụ tùng hàng đầu nó thay đổi kích cỡ chính nó và con của nó đúng cách (tốt ... trong trường hợp của tôi lên đến QScrollArea
, phần còn lại yêu cầu một kích thước từ dưới lên trên. Vui lòng làm thế nào để hoạt động!)
--- ah! ha! thời điểm (hoặc: những gì bạn thấy đọc mã thực hiện!)
Hôm nay tôi gặp phải một vấn đề khác chỉ cần gọi đúng ... Tôi không thể tìm thấy bất kỳ thứ gì đáng giá trong tài liệu.
Tất cả các đối tượng đều có bố cục ngay bây giờ, nhưng một phụ huynh nhất định sẽ không thay đổi kích thước đúng cách. Đơn giản.
tôi đã có một cuộc gọi đến mẹ như sau:
// changes to the children are changing the geometry
parentWidget()->updateGeometry();
Yeah. Các tài liệu nói rằng đó là những gì bạn phải làm. Không có gì xảy ra với cuộc gọi đó. Không biết nó phải làm gì, tôi không nhìn vào chức năng đó. Nó không bao giờ làm bất cứ điều gì cho tôi anyway.
Vì vậy ... Tôi đã xem bố cục để tìm hiểu cách thức gửi thông tin lên/xuống. Tôi không thấy nhiều ngoại trừ một nhận xét thú vị:
// will trigger resize
Chế độ này được cho là chế độ SetFixedSize
. Để đạt được chức năng đó, bạn cần tạo bố cục để cập nhật. Ah! Có ... bố cục, chứ không phải tiện ích con phụ huynh ... hãy thử thay vào đó:
parentWidget()->layout()->update();
Và thì đấy! Nó thay đổi kích thước chính xác trong mọi trường hợp tôi có. Khá đáng kinh ngạc là tiện ích updateGeometry()
không kích hoạt hiệu ứng tương tự ...
Điều bạn đang cố gắng thực hiện mà hệ thống bố cục tích hợp không thể làm cho bạn? Thật khó để trả lời một câu hỏi mà sẽ có bất kỳ sự sử dụng nào đối với bạn khi nó về cơ bản nhét xuống "làm cách nào để làm cho mọi thứ hoạt động?" – Chris
Đối với các giao diện GUI/Bố cục, bao gồm ảnh chụp màn hình có chú thích có thể giúp ích rất nhiều. Không có thiếu người ở đây mà muốn tìm hiểu mọi thứ khi họ có thông tin chắc chắn :) –
nếu bạn không gặp vấn đề với mã của mình thì bạn có thể chia sẻ nó trên www.ideone.com: D – blueskin