2011-08-11 28 views
6

Tôi đang cố gắng tạo đơn đăng ký gồm QMainWindow, tiện ích con trung tâm là QToolBar (có thể không bình thường, nhưng vì mục đích của tôi, thanh công cụ rất phù hợp). Docks chỉ được phép bên dưới. Tôi đã thêm một số QDockWidget vào đó và QAction trên QToolBar bật và tắt QDockWidget và tắt bằng removeDockWidget()restoreDockWidget().Cách thay đổi kích cỡ QMainWindow sau khi xóa tất cả DockWidgets?

Kích thước mặc định của QMainWindow là 800, 24, QToolBarmaximumHeight cũng được đặt thành 24. Ngay sau khi removeDockWidget() được gọi, hình học của QMainWindow được đặt lại thành (0,0,800,24) với setGeometry().

Điều tôi muốn đạt được là thay đổi kích thước chiều cao của QMainWindow thành 24 khi xóa DockWidget. Các setGeometry() dường như làm việc kể từ khi chiều rộng và vị trí thay đổi cho phù hợp, nhưng vui vẻ đủ, chiều cao không nhúc nhích. Và đó là vấn đề của tôi thực sự :)

Bạn nghĩ sao?

Here is a screen-cast minh họa sự cố trong tầm tay.

NB: nếu tôi tạo ra kịch bản tương tự sử dụng một QWidget hơn QMainWindow, và sử dụng một show() hoặc hide() trên widget con, sau đó tôi có thể thay đổi kích thước phụ huynh với adjustSize() mà không vấn đề: có vẻ như vấn đề ở đây trên là QMainWindow cụ thể .

+0

bạn có thể cung cấp cho các liên kết đến mã của bạn? Bạn đang sử dụng phiên bản Qt nào? –

Trả lời

2

Tùy chọn

a) Bạn có thể quá tải sizeHint() một chức năng ảo. Hãy để nó trả lại kích thước bạn muốn cho cửa sổ chính của bạn.

b) Trong hàm khởi tạo của cửa sổ chính, bạn có thể gọi setMinimumSize() và setMaximumSize() cái khác, cả hai đều có kích thước cửa sổ chính mong muốn. Nếu bạn giữ cả hai bạn sẽ có được một kích thước cố định.

c) Hãy xem bố cục() -> setResizeMode (Cố định).

+0

Cảm ơn. Tôi không chắc tôi làm theo lời giải thích của bạn. Tôi đã cố gắng để thay đổi hình học của QmainWindow với updateGeometry() nhưng nó không có hiệu lực thực sự.Tôi đặt mã ở đây ở trên với đầu ra để cho bạn thấy những gì tôi có ý nghĩa. – Benjamin

+0

Kiểm tra câu trả lời của tôi và xem nó có hợp lý không :) – Benjamin

+0

@Benjamin ... Bạn đã thử quá tải sizeHint hay gọi setMinimumSize() và setMaximumSize()? nếu có thì bạn có nhận được kích thước mong muốn mà bạn đang tìm kiếm không? –

1

Có vẻ như bạn đã hiểu sai ý nghĩa của phương pháp QMainWindow.sizeHint().

Theo QWidget.sizeHint() documentation (từ đó QMainWindow kế thừa):

Khách sạn này giữ đề nghị kích thước cho widget.

Nếu giá trị của thuộc tính này là kích thước không hợp lệ, không có kích thước nào được khuyến nghị. Việc triển khai mặc định sizeHint() trả về kích thước không hợp lệ nếu không có bố cục cho tiện ích này và trả lại kích thước ưa thích của bố cục nếu không.

Để có được kích thước thực tế của cửa sổ, bạn nên sử dụng phương pháp QMainWindow.geometry() thay vào đó, mang đến cho tất cả các thông tin về kích thước widget và các mục:

win_geo = self.geometry() 
win_top = win_geo.top() 
win_bottom = win_geo.bottom() 
win_left = win_geo.left() 
win_right = win_geo.right() 
win_width = win_geo.width() 
win_height = win_geo.height() 
+0

Bạn thực sự đúng về sai lầm mà tôi đã cam kết về 'sizeHint()'. Nhưng như tôi đã giải thích ngay bây giờ trong câu trả lời của tôi: hình học chỉ áp dụng cho khu vực khách hàng, và khi dock được gỡ bỏ, khu vực khung không bị ảnh hưởng. Do đó thiết lập một hình học mới không đủ, ngay cả 'adjustSize()' không thể thay đổi kích thước khung hình. Nếu bạn có bất kỳ giải pháp Qt nào để thay đổi kích thước khung hình, vui lòng cho tôi biết :) – Benjamin

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