2010-06-20 4 views
2

QDockWidget 중 하나에 문제가 있습니다. QDockwidget에 여러 개의 QWidget 항목이 있는데 때때로 가끔씩 표시되는 경우도 있습니다.내용을 변경할 때의 QDockWidget 동작

QDockWidgetQWidgets가 나타나지 않을 경우에만 ... 그 내용에 따라 자체의 크기를 조절뿐만 아니라 그들이 사라질 때 싶습니다는 ...

지금까지 내 QDockWidgetQWidgets 더 때 자체의 크기를 조정 그 안에 표시되지만, 내가 그들을 사라지게 할 때, QDockWidget은 그의 이전 크기에서 머물러 있습니다 ...

어떤 아이디어가 도움이 될까요? 사전에

감사합니다!

답변

6

QMainWindow 도크 영역에있는 QDockWidget의 크기 제어와 관련된 여러 게시물이 여러 해 동안있었습니다. 나는 또한이 문제로 어려움을 겪어 왔으며 부분적이고 다소 불만족스러운 해결책을 달성 할 수있었습니다. 주된 문제는 (말장난을 핑계 치는 경우) 도킹 영역을 관리하는 작업 인 QMainWindow의 컨텍스트에서 도킹 메커니즘을 파악할 수 없다는 것입니다. 레이아웃 관리 크기 정책 및 크기 힌트 컨트롤을 사용하려는 시도는 효과적이지 않습니다. QMainWindow은 독 영역 크기를 변경할 때 고유 한 작업을 수행합니다. QMainWindow 서브 클래스 (MW)와 QDockWidget 서브 클래스 (DW)를 시작으로

: 나는 있었다 성공을 제한 어떤

첫째,. DWQWidget이고 이며 DWsetWidget입니다. 이 레이아웃에는 문맥에 따라 표시되거나 숨겨 지도록 의도 된이 패널 중 하나를 사용하여 패널이라고 부르는 두 위젯이 있습니다. DW이 하단 또는 상단 도킹 영역에 있거나 부동 상태 인 경우 그렇지 않으면 숨겨집니다. 구성 후 다른 패널의 sizeHint을 적절한 여백 간격과 함께 DW의 "기본 크기"를 설정하는 데 사용하고 적절하게 기본 크기로 증분을 제공하는 가시성을 변경하는 패널의 너비는 sizeHint입니다. DW 구현에는 패널에 setVisible을 적용하고 sizeHint의 값을 증분 값만큼 변경하여 가변 패널을 활성화 또는 비활성화하는 데 사용되는 panel_visible 메소드가 제공됩니다. DW 및 해당 패널의 크기 정책은 최소로 설정됩니다.

MW에서 DWdockLocationChangedtopLevelChanged 신호는 DW_resize 슬롯에 접속된다. 여기서 DWisVisibleisWindow는 거짓과 MW::dockWidgetArea 보고서 중 하나 LeftDockWidgetArea 또는 RightDockWidgeAreaDW::panel_visible(false)은 (위의 조건은 물론,라고 DW::panel_visible(true)을 충족하지 않을 때) 유효 DW 크기를 변경하기 위해 호출 될 때. 에 DW::resizeupdateGeometryupdate을 호출해도 도크 영역 크기에는 영향을주지 않습니다. 그러나 DW::setMaximumSize(DW::sizeHint())을 호출하면 도킹 영역의 크기가 올바르게 조정됩니다 (updateGeometry 또는 update 필요 없음). 이것은 DW이 떠 다니거나 (제목 표시 줄을 드래그하거나 두 번 클릭하여) 제목 표시 줄을 두 번 클릭하거나 측면 독 영역 위로 드래그하여 다시 도킹 한 경우 원하는대로 작동합니다. 여태까지는 그런대로 잘됐다.

지금 캐치 :

는 사용자가 침 핸들을 드래그하여 도킹 영역의 크기를 조절할 수 있도록 고정 된 크기의 제약에서 출시되는 규정 DW 크기로 DW 요구의 도크 지역에 맞게 MW을 강요 데 도킹 영역과 중앙 영역 사이에 MW에 의해 제공됩니다. 분명한 대답은 DW::setMaximumSize(0xFFFFFF, 0xFFFFFF)을 호출하여 DW 제약 조건을 "해제"하는 것입니다. 네, 장면 뒤에서 일어나는 업데이트 페인팅 최적화가 두 가지 크기 조정 이벤트를 결합하여 초기 도크 축소 작업이 손실된다는 것을 제외하고는 가능합니다. qApp->sendPostedEvents()qApp->flush()을 두 setMaxmimumSize 콜 사이에 넣으면이 최적화 효과를 피할 수 있습니다. 도크 영역은 DW 크기에 맞게 조정 된 다음 사용자가 도크 영역의 크기를 조정할 수 있도록 해제됩니다. DWDW 제목 표시 줄을 더블 클릭 만 DWMW의 측면 도크에 드래그하지 않는 경우가 도킹에 떠에서 갈 때

이 솔루션은 작동합니다. 예를 들어 사용자가 왼쪽 도킹에서 오른쪽 도킹으로 DW을 드래그하면 오른쪽 도킹 영역의 크기가 예상대로 조정되지 않습니다. 수신 도크 영역은 한쪽에서 다른쪽으로 드래그하는 동안 생성되는 부동 DW의 크기로 유지됩니다. 수신 도킹 영역의 DW에 제목 표시 줄이 두 번 클릭되어 (다시 플로팅되도록) 다시 두 번 클릭하면 (동일한 도크 영역으로 돌아 가기 위해) MW이 이제 의도 한대로 도킹 영역에 맞습니다. 근접 검사에서 - 모니터함으로써 MW::paintEvent - I 독 영역은 의도 된 크기를 끝나면 flush() 즉시 DW 의도 한 크기의 리포트 및 상기 제 setMaximumSizepaintEvent 함께 발생 DW을 unconstrains paintEvent 뒤에 볼 DW은 여전히 ​​의도 된 크기입니다. DWflush() 다시 바로 paintEvent 뒤에 도크 영역으로 드래그 때 의도 한 크기의 DW 보고서는하지만,이 경우 두 번째 setMaximumSize 후 지금 DW 놀랍게도 가진 이전 부동 크기의 두 paintEvent의가있는 곳 !

정확하게 크기를 정한 후에 설명 할 수없는 DW 크기의 무시를 방지하는 방법을 아직 찾지 못했습니다. 슬롯으로 연결되는 신호가 방출되기 전에 MW이 보유한 크기 정보에서 DW_resize 슬롯 처리가 반환 된 후 추가 크기 조정 이벤트가 MW에 의해 생성되는 것 같습니다. MW::eventFilter을 모니터링하면 DW_resize이 반환 된 후 Resize 이벤트가 발생하여 DW 크기가 슬롯 코드에서 설정 한 크기에서 부동 상태 일 때의 크기로 다시 변경됩니다. DW 바를 두 번 클릭하면 DW이 부동으로 다시 부두로 이동하지 않으므로 DW_resize 슬롯이 돌아 오면 추가로 Resize 이벤트가 발생하지 않습니다.

DWDW_resize 슬롯에서 올바르게 크기 조정 된 후 예기치 않은 크기 조정 되돌리기가 발생하지 않도록 방지하는 방법은 어렵습니다. DW::resizeEvent에서 아마도 일부 강요는이 문제를 피할 수 있습니다 ....

물론 Qt 개발자가 도크 관리 활동 (특히 독 영역 크기 조정) 및/또는 독 영역에 사용하는 위젯에 대한 액세스를 통해 응용 프로그램 개발자에게 QMainWindow API의 철저한 제어 기능을 제공하는 것이 더 좋을 것입니다 조치.

현재 Linux, OS X 및 MS/Windows에서 Qt 4.6.2를 사용하고 있습니다. 위의 디버그 보고서는 Intel OS X 10.6.7 시스템에서 수행되었습니다. 결과는 플랫폼에 따라 다소 차이가 있지만 기본적인 문제는 같습니다. 아마도이 QMainWindow/QDockWidget 문제는 이후 버전의 Qt에서 처리 되었습니까? 누군가 여기에서 무슨 일이 일어나고 있는지에 대한 더 깊은 통찰력을 가지고 있으며 간단한 해결책을 제시 할 수 있습니까?

+0

깜짝 놀랄만 한 답장을 보내 주셔서 감사합니다. –

0

동일한 문제가 발생했습니다. 설명 할 수 없게 restoreState()을 두 번 넣으면 해결됩니다.
Qt 4.7.0을 사용하고 있습니다.

void MainWnd::showEvent(QShowEvent *se){ 
QMainWindow::showEvent(se); 

static bool first = true; 

if (first){ 
    restoreState(...); 
    restoreState(...); 
    first = false; 
} 
} 
관련 문제