2012-10-28 10 views
0

그래픽 요소를 포함하는 사용자 정의 된 파일을 편집 할 수있는 일종의 그래픽 소프트웨어를 디자인하고 개발해야합니다.QMdiArea에서 여러 문서를 처리하는 가장 좋은 방법은 무엇입니까?

QMdiArea 덕분에 많은 소프트웨어가 포함될 것으로 예상됩니다. 내 QMainWindow 안에있는 위젯.

각 문서에 대해 함께 작동하므로 QGraphicsViewQGraphicsScene이 모두 필요합니다.

이제 내 질문에 내가 QGraphicsScene 자신을 보호/개인 멤버 QGraphicsView을 상속한다, 또는 나는 QWidget을 상속 QGraphicsView/QGraphicsScene의 인스턴스를 처리하는 클래스를 작성해야합니까?

내가 생각하지 못한 해결책이 있습니까?

답변

1

먼저 QGraphicsScene 및 QGraphicsView를 관리하기 위해 QWidget이 필요하지 않다고 생각합니다. 이를 염두에두고, "모범 사례"는 일반적으로 가능한 경우 서브 클래 싱을 피하는 것입니다. 궁극적으로 QGraphicsView를 하위 클래스로 분류해야 할 수도 있습니다 (기본 기능을 변경하려는 경우). 그러나 질문에 아무것도 표시하지 않아도됩니다. 또한 뷰의 현재 장면을 반환하는 함수 QGraphicsView::scene()이 있으므로 장면을 멤버로 만들 필요가 없습니다 (이미 있습니다). 만약 당신이 특정보기 또는 장면에 액세스해야하는 경우

, 당신은 같은 것을 할 수 있습니다

MainWindow::onActionClearActiveWindow() // just an example 
{ 
    QMdiArea *myMdiArea = static_cast<QMdiArea*>(centralWidget()); 
    QGraphicsView *activeView = static_cast<QGraphicsView*>(myMdiArea->widget()); 
    QGraphicsScene *activeScene = activeView->scene(); 
    activeScene->clear(); 
} 

는 모든 서브 윈도우의 목록을 반환 QMdiArea::subWindowList()를 참조하십시오.

+0

그러나'QGraphicsView'의'scene' 멤버는 null로 설정되어 있지 않습니까? 그래서 전체 내용을 서브 클래 싱하여 사용자 정의 장면 개체 등을 만들려고 생각했습니다. 어쨌든 도와 주셔서 감사합니다! –

+1

'scene' 멤버는 처음에 QGraphicsView를 생성 할 때 null이지만,'view-> setScene (new QGraphicsScene)'만하면됩니다. 이렇게하면 뷰의 장면이 생성되고 이후에는'view-> scene()'을 호출하여 해당 장면의 포인터를 얻을 수 있습니다. – Anthony

+0

다시 고마워. –