2012-07-18 4 views
7

우리의 응용 프로그램에는 런타임에로드되는 플러그인에 의해 추가되는 dockwidget이 있기 때문에 다양한 수의 dockwidget이 있습니다. 모든 dockwidget이 반드시 동시에 표시되어야하는 것은 아닙니다. 이것은 사용자가 작업하고있는 플러그인과 활성화 된 플러그인에 따라 크게 달라집니다.QMainWindow에서 지나치게 많은 dockwidget과 추한 중복을 피하는 방법은 무엇입니까?

그러나 너무 많은 dockwidget이 프로그래밍 방식으로 addDockWidget(...)과 함께 추가되면 서로 겹치기 시작합니다 (탭이 아닌 다른 영역의 영역에 페인트되는 콘텐츠의 관점에서 볼 때 분명히 손상된 것 같습니다).).

Overlapping dockwidgets

사용자는 여전히 남아 공간이 dockareas 에 dockwidgets를 이동할 수 있지만, 레이아웃/메인 윈도우는 성공적으로 "혼잡"dockarea에 (untabbed) 다시 추가를 방지 할 수 있습니다.

우리는 탭 부두는 사용자가이 필요한 dockwidgets을 마련 할 수 있도록 허용 할 수 있지만, 우리는이 (도크 지역 당 하나) 너무 많은 동시에 볼 수 dockwidgets의 수를 제한하는 것이기 때문에 QMainWindow::ForceTabbedDocks을 사용하지 않으.

어떻게하면 더킹 위젯이 추가되는 것을 제어 할 수 있습니까?

답변

5

직접 질문에 답하지 않고 실제로 Qt를 잊어 버리고 실제로 전체 상호 작용이 어떻게 작동하는지 생각해 볼 가치가 있습니다. 사용자 기대치는 무엇입니까? 10 개의 서로 다른 플러그인이 활성화되면 실제로 어떤 일이 발생해야합니까? 그들이 도킹되어야하거나 떠 있어야 하는가? 아니면 MainWindow 가장자리의 작은 버튼과 같은 초기 상태의 고정 가능한 도킹 윈도우가되어야 하는가? Qt가 인터페이스를 개발하기 위해 직접적인 방법을 제공하는지, 그리고 개발할 필요가있는 추가 컴포넌트가 아닌지를 알아 내면 Qt를 살펴보고 시작할 수 있습니다. 그 인터페이스를 작동 시키십시오.

내 자신의 경험에 비추어 볼 때, 비슷한 인터페이스를 오래 전에 MFC에서 개발했습니다. 우리가 한 방식은 도킹 된 창 중 일부가 있어야한다고 여겨져 도킹 된 상태로 올 것입니다.그런 다음에는 항상 보이지 않아도되지만 신속하게 사용할 수 있어야하는 창 세트가 있었으며 초기 상태는 숨겨진 핀 고정 가능 창 이었기 때문에 MainWindow 가장자리의 버튼으로 나타났습니다. 마지막으로 사용자가 항상 필요로하지 않고 파일 ->보기 메뉴에서 호출 할 수있는 세 번째 세트가있었습니다. 일단 사용자가 그것을 볼 수있게 만들면, 일반적으로 사용자는 그것을 처음 두 그룹 중 하나에 할당하거나 해상 상태로 유지합니다. 이 전체 구성은 구성 파일에 저장되었으며 이후부터는 플러그인이로드/활성화 될 때마다 연관된 도킹 윈도우의 마지막 사용 상태가 사용되었습니다. 비록 꽤 많은 추가 작업이 있었지만 최종 결과는 모든 사용자를 만족시키는 것이 었습니다.

+1

감사합니다. 나는 이것이 건전한 조언이라고 생각한다. 이는 기술적 인 세부 사항에서 길을 잃을 때 전체적인 디자인과 큰 그림을 재고하고 다시 생각해 보는 것이 항상 좋은 아이디어라는 좋은 예가 될 수 있습니다. –

2

setDockOptions(QMainWindow::AllowNestedDocks)을 사용해 보셨습니까? 지금은 테스트 할 수 없지만 도움이 될 수 있습니다. 기본적으로 는 QMainWindow::dockOptions은 그래서 당신이

setDockOptions(QMainWindow::AllowNestedDocks | QMainWindow::AnimatedDocks | QMainWindow::AllowTabbedDocks) 

편집 같은 것을 원하는 것이 AnimatedDocks | AllowTabbedDocks로 설정됩니다 : 당신은 너무 많은 문제가 경우, 잘못된 방법으로 이것에 대해 갈 수 있습니다. 도킹을 사용하는 대신 QMdiWindow와 함께 QMdiArea를 사용해 볼 수 있습니다. 이것은 귀하의 프로그램에는 효과가 없을 수도 있지만, 그것에 대해 생각해야 할 것입니다.

+0

내가'AllowNestedDocks'를 좋아하는지 확신 할 수는 없지만 이것을 시도 할 것입니다. 이제는 유동적 인 위젯을 옮기고 싶을 때 dockwidget이 다른 영역으로 스냅하기 시작하는시기에 이미 상당히 짜증나게됩니다. 중첩을 활성화하면 도킹 영역의 수를 늘릴 수 있습니다. 그렇지 않습니까? –

+0

예. Qt 문서는 많은 부두에 좋지만 성가신 일이라고 말합니다. –

+0

더 악화됩니다. 우선, 그것은 작동하지 않습니다. 도킹 위젯의 단일 "레벨"로 이전과 동일합니다. 그러나 서로 옆에 도킹 위젯을 중첩시킨 다음 그 영역에 프로그래밍 방식으로 다른 도킹 위젯을 추가하면 ** 두 중첩 된 도킹 위젯과 중복됩니다 :/ –

1

이 내가 시도 솔루션입니다 :

  1. 내가 QTCreator에서 창 빈 프로젝트를 생성은, "새로운 독"과 DockWidget 표시 최소한의 메뉴 dockWidget

  2. 이름 이것은이다 triggered() 내 메뉴 항목에 대한 처리기 :

    void MainWindow::on_actionNew_Dock_triggered() 
    {  
        QDockWidget* w = new QDockWidget("Demo", ui->dockWidget); 
        this->addDockWidget(Qt::LeftDockWidgetArea,w); 
        this->tabifyDockWidget(ui->dockWidget,w); 
    } 
    

tabifyDockWidget(QDockWidget* first, QDockWidget* second)은 두 번째 dockwidget을 첫 번째 스택에 스택하는 QMainWindow 메소드입니다. 희망이 도움이 되길 ...

+0

그러나 먼저 이미 도킹 위젯이 있는지 확인해야합니다 그면과 여러면에 어느 쪽이 tabify할지 결정하십시오. 그러나 그것으로도 문제가 해결되지는 않을 것입니다 :'LeftDockWidgetArea'에 두개의 dockwidget이 있다고 가정하십시오. 그들의 minimumSize, 그들은 모든 사용 가능한 공간을 차지합니다. 하나는 작고 하나는 크다. 나는 상당히 큰 dockwidget을 추가한다. 만약 내가 새로운 dockwidget으로 작은 탭을 선택했다면 똑같은 문제 (두 개의 dockwidgets가 나란히 있습니다. 너무 커서 Qt가 minimumSize를 오버라이드하여 추악한 오버랩을 발생시킵니다.) –

+0

아니면 오전 나는 뭔가를 놓친 것일까? 어쩌면 우리는 어떤 dockwidget이 추가 될 수 있는지, 언제, 어떻게 그리고 어디에서 "프로세스"의 전체를 재정의해야만하는지 ... –

+0

당신은 플러그인 수준에서 탭핑/도킹 정책을 구현할 수 있습니다. 'QWidget'에서 가져 와서'QDockWindow'의 메인 위젯으로 설정하십시오.이 경우 공통 플러그인 조상은 자손에 의해 수정 될 수있는 기본적인 도킹/위치 지정 정책을 고안 할 수 있습니다 .. –

관련 문제