2011-08-24 19 views
5

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.

On screen keyboard

(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ự ...

+2

Đ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

+0

Đố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 :) –

+0

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

Trả lời

1

Điều này sẽ không giúp bạn giải quyết vấn đề ngay lập tức nhưng tôi muốn cho bạn thấy bàn phím tôi đã tạo bằng bố cục và nút tiêu chuẩn. Nó không hoàn hảo và nó vẫn sẽ không giúp bạn với một phím enter kéo dài hai hàng nhưng nó không phải là xấu. Nó cũng có thể thay đổi kích cỡ bằng cách thay đổi kích thước cửa sổ, mặc dù tôi không chắc liệu điều đó có rõ ràng từ những hình ảnh dưới đây vì SO có thể mở rộng chúng hay không. (Bạn có thể xem những hình ảnh thực tế bằng cách mở chúng trong tab riêng của họ)

enter image description here

enter image description here

Dù sao, điều này đã được thực hiện chỉ sử dụng thiết kế Qt không có mã hóa bằng tay. Nó bao gồm một bố trí dọc cấp cao nhất với 5 bố trí nằm ngang trong đó. Các nút sau đó được chèn vào một trong 5 bố cục nằm ngang. Kích thước của các phím có thể được kiểm soát bằng cách thiết lập các chính sách kích thước ngang và dọc để "bỏ qua" cho hầu hết các nút và sau đó là "tối thiểu" ngang cho các nút mà bạn muốn mở rộng hơn. Mọi thứ có thể được điều chỉnh bằng cách đặt các giới hạn kích thước tối thiểu và tối đa cho các nút. Khi thay đổi kích thước, các nút sẽ không duy trì tỷ lệ tương đối của họ mặc dù, mà có lẽ sẽ mất một số lập trình tùy chỉnh.

Kiểu dáng trong ví dụ của bạn có thể được xấp xỉ khá tốt bằng cách sử dụng các tờ kiểu css và hình nền.Vẫn không phải là một nỗ lực nhỏ nhưng bạn sẽ có thể nhận được hầu hết các cách có mà không có bố trí tùy chỉnh và các nút.

+1

Vâng. Có rất nhiều vấn đề với QSS. Nó chỉ xếp tầng khi tạo các widget. Sau đó, nó hoàn toàn quên đi cha mẹ. Vì vậy, đó thực sự không phải là thực tế. Điều này đang được nói, tôi sử dụng QSS cho màu sắc, đường viền, cỡ chữ, hình ảnh ... Bây giờ, suy nghĩ về nó, tôi tự hỏi liệu vấn đề của tôi có thực sự là do tất cả tổ tiên không bao gồm bố cục. Tôi nghĩ rằng tôi đã đọc ở đâu đó để bố cục hoạt động tốt, bạn cần chúng ở mọi nơi. Cuối cùng, trong trường hợp của tôi, bàn phím có thể được chuyển sang tất cả các loại bố trí. Ví dụ, tôi có thể thay đổi nó thành một bàn phím Kania hoặc tiếng Pháp. –

2

Mặc dù có thể thực hiện những gì bạn muốn có vẻ như vấn đề bạn đang gặp phải là vì bạn đang sử dụng Qt theo cách không được sử dụng. Tại sao bạn cần các widget riêng biệt cho mỗi khóa được biểu diễn trên bàn phím?

tôi thấy hai lựa chọn, cả hai đều là tốt hơn một cách nào đó:

  1. Sử dụng QGraphicsSceneQGraphicsView.
  2. Một tiện ích con tùy chỉnh sử dụng bản vẽ tùy chỉnh để hiển thị bàn phím (và có thể sử dụng di chuột để tìm gợi ý).

Tùy chọn đầu tiên có thể tốt hơn. Chìa khóa của bạn sau đó có thể được đại diện bởi QGraphicsSimpleTextItem hoặc thậm chí là QGraphicsSvgItem. Nó cũng cung cấp một số bố cục tiêu chuẩn hoặc bạn có thể chọn write your own layout. Theo mặc định, bạn có thể sử dụng keyPressEvent hoặc mouseReleaseEvent để phản hồi tương tác của người dùng.

Tôi rất muốn giới thiệu bạn hãy xem QGraphicsView examples để biết ý tưởng của bạn.

Nếu bạn đi tuyến đường thứ hai, bạn sẽ cần phải ghi lại các vị trí chính khác nhau để bạn có thể trả lời tương ứng khi người dùng di chuyển chuột, nhấp chuột, v.v.

+0

Tôi có phải làm mọi thứ bằng tay trong trường hợp này không? Với PushButtons tôi nhận được kết xuất miễn phí và nhấp() sự kiện ... Ngoài ra bàn phím của tôi là một ví dụ, vấn đề tôi đã có trong một danh sách mà chuỗi bố trí phá vỡ vì QScrollArea (tức là dưới QScrollArea kích thước không bị giới hạn về chiều cao, chúng tôi muốn thay đổi kích thước tiện ích bên trong QScrollArea càng cao càng tốt! Nhưng QScrollArea phải là một kích thước hợp lý cho mục đích này.) –

+0

Bài chỉnh sửa cho mỗi nhận xét. –

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