QMainWindow
도크 영역에있는 QDockWidget
의 크기 제어와 관련된 여러 게시물이 여러 해 동안있었습니다. 나는 또한이 문제로 어려움을 겪어 왔으며 부분적이고 다소 불만족스러운 해결책을 달성 할 수있었습니다. 주된 문제는 (말장난을 핑계 치는 경우) 도킹 영역을 관리하는 작업 인 QMainWindow
의 컨텍스트에서 도킹 메커니즘을 파악할 수 없다는 것입니다. 레이아웃 관리 크기 정책 및 크기 힌트 컨트롤을 사용하려는 시도는 효과적이지 않습니다. QMainWindow
은 독 영역 크기를 변경할 때 고유 한 작업을 수행합니다. QMainWindow
서브 클래스 (MW
)와 QDockWidget
서브 클래스 (DW
)를 시작으로
: 나는 있었다 성공을 제한 어떤
첫째,. DW
은 QWidget
이고 이며 DW
에 setWidget
입니다. 이 레이아웃에는 문맥에 따라 표시되거나 숨겨 지도록 의도 된이 패널 중 하나를 사용하여 패널이라고 부르는 두 위젯이 있습니다. DW
이 하단 또는 상단 도킹 영역에 있거나 부동 상태 인 경우 그렇지 않으면 숨겨집니다. 구성 후 다른 패널의 sizeHint
을 적절한 여백 간격과 함께 DW
의 "기본 크기"를 설정하는 데 사용하고 적절하게 기본 크기로 증분을 제공하는 가시성을 변경하는 패널의 너비는 sizeHint
입니다. DW
구현에는 패널에 setVisible을 적용하고 sizeHint
의 값을 증분 값만큼 변경하여 가변 패널을 활성화 또는 비활성화하는 데 사용되는 panel_visible
메소드가 제공됩니다. DW
및 해당 패널의 크기 정책은 최소로 설정됩니다.
은 MW
에서 DW
dockLocationChanged
및 topLevelChanged
신호는 DW_resize
슬롯에 접속된다. 여기서 DW
isVisible
는 isWindow
는 거짓과 MW::dockWidgetArea
보고서 중 하나 LeftDockWidgetArea
또는 RightDockWidgeArea
이 DW::panel_visible(false)
은 (위의 조건은 물론,라고 DW::panel_visible(true)
을 충족하지 않을 때) 유효 DW
크기를 변경하기 위해 호출 될 때. 에 DW::resize
및 updateGeometry
및 update
을 호출해도 도크 영역 크기에는 영향을주지 않습니다. 그러나 DW::setMaximumSize(DW::sizeHint())
을 호출하면 도킹 영역의 크기가 올바르게 조정됩니다 (updateGeometry
또는 update
필요 없음). 이것은 DW
이 떠 다니거나 (제목 표시 줄을 드래그하거나 두 번 클릭하여) 제목 표시 줄을 두 번 클릭하거나 측면 독 영역 위로 드래그하여 다시 도킹 한 경우 원하는대로 작동합니다. 여태까지는 그런대로 잘됐다.
지금 캐치 :
는 사용자가 침 핸들을 드래그하여 도킹 영역의 크기를 조절할 수 있도록 고정 된 크기의 제약에서 출시되는 규정 DW
크기로 DW
요구의 도크 지역에 맞게 MW
을 강요 데 도킹 영역과 중앙 영역 사이에 MW
에 의해 제공됩니다. 분명한 대답은 DW::setMaximumSize(0xFFFFFF, 0xFFFFFF)
을 호출하여 DW
제약 조건을 "해제"하는 것입니다. 네, 장면 뒤에서 일어나는 업데이트 페인팅 최적화가 두 가지 크기 조정 이벤트를 결합하여 초기 도크 축소 작업이 손실된다는 것을 제외하고는 가능합니다. qApp->sendPostedEvents()
과 qApp->flush()
을 두 setMaxmimumSize
콜 사이에 넣으면이 최적화 효과를 피할 수 있습니다. 도크 영역은 DW
크기에 맞게 조정 된 다음 사용자가 도크 영역의 크기를 조정할 수 있도록 해제됩니다. DW
이 DW
제목 표시 줄을 더블 클릭 만 DW
이 MW
의 측면 도크에 드래그하지 않는 경우가 도킹에 떠에서 갈 때
이 솔루션은 작동합니다. 예를 들어 사용자가 왼쪽 도킹에서 오른쪽 도킹으로 DW
을 드래그하면 오른쪽 도킹 영역의 크기가 예상대로 조정되지 않습니다. 수신 도크 영역은 한쪽에서 다른쪽으로 드래그하는 동안 생성되는 부동 DW
의 크기로 유지됩니다. 수신 도킹 영역의 DW
에 제목 표시 줄이 두 번 클릭되어 (다시 플로팅되도록) 다시 두 번 클릭하면 (동일한 도크 영역으로 돌아 가기 위해) MW
이 이제 의도 한대로 도킹 영역에 맞습니다. 근접 검사에서 - 모니터함으로써 MW::paintEvent
- I 독 영역은 의도 된 크기를 끝나면 flush()
즉시 DW
의도 한 크기의 리포트 및 상기 제 setMaximumSize
후 paintEvent
함께 발생 DW
을 unconstrains paintEvent
뒤에 볼 DW
은 여전히 의도 된 크기입니다. DW
는 flush()
다시 바로 paintEvent
뒤에 도크 영역으로 드래그 때 의도 한 크기의 DW
보고서는하지만,이 경우 두 번째 setMaximumSize
후 지금 DW
놀랍게도 가진 이전 부동 크기의 두 paintEvent
의가있는 곳 !
정확하게 크기를 정한 후에 설명 할 수없는 DW
크기의 무시를 방지하는 방법을 아직 찾지 못했습니다. 슬롯으로 연결되는 신호가 방출되기 전에 MW
이 보유한 크기 정보에서 DW_resize
슬롯 처리가 반환 된 후 추가 크기 조정 이벤트가 MW
에 의해 생성되는 것 같습니다. MW::eventFilter
을 모니터링하면 DW_resize
이 반환 된 후 Resize 이벤트가 발생하여 DW
크기가 슬롯 코드에서 설정 한 크기에서 부동 상태 일 때의 크기로 다시 변경됩니다. DW
바를 두 번 클릭하면 DW
이 부동으로 다시 부두로 이동하지 않으므로 DW_resize
슬롯이 돌아 오면 추가로 Resize 이벤트가 발생하지 않습니다.
DW
이 DW_resize
슬롯에서 올바르게 크기 조정 된 후 예기치 않은 크기 조정 되돌리기가 발생하지 않도록 방지하는 방법은 어렵습니다. DW::resizeEvent
에서 아마도 일부 강요는이 문제를 피할 수 있습니다 ....
물론 Qt 개발자가 도크 관리 활동 (특히 독 영역 크기 조정) 및/또는 독 영역에 사용하는 위젯에 대한 액세스를 통해 응용 프로그램 개발자에게 QMainWindow
API의 철저한 제어 기능을 제공하는 것이 더 좋을 것입니다 조치.
현재 Linux, OS X 및 MS/Windows에서 Qt 4.6.2를 사용하고 있습니다. 위의 디버그 보고서는 Intel OS X 10.6.7 시스템에서 수행되었습니다. 결과는 플랫폼에 따라 다소 차이가 있지만 기본적인 문제는 같습니다. 아마도이 QMainWindow
/QDockWidget
문제는 이후 버전의 Qt에서 처리 되었습니까? 누군가 여기에서 무슨 일이 일어나고 있는지에 대한 더 깊은 통찰력을 가지고 있으며 간단한 해결책을 제시 할 수 있습니까?
깜짝 놀랄만 한 답장을 보내 주셔서 감사합니다. –