2014-12-01 4 views
1

전환 나는 내가 GraphicsView에 새로운 포인터를 생성 MainWindow의 모든 newfile()에 새로운 mdiSubWindow을 만드는거야QMDI 하위 창은

class MainWindow 
{  GraphicsView *gv; }; 
class GraphicsView 
{  Scene *scene; }; 
class Scene 

같은 클래스와 MDI 응용 프로그램을 가지고있다.

void MainWindow::newFile() 
{ 
    gv = new GraphicsView; 
    QMdiSubWindow *w = mdiArea->addSubWindow(gv); 
    mdiArea->setActiveSubWindow(w); 
} 

그리고 GraphicsView의 생성자는 새로운 장면을 생성합니다.

GraphicsView::GraphicsView() 
{ 
    scene = new Scene; 
    setScene(scene); 
} 

이제 여러 개의 하위 창이 만들어지면 이전 하위 Windows에서 작업 할 수 없습니다. 최신 하위 창만 예상대로 작동합니다. 예를 들면. 나는 최신 서브 윈도우에서만 QGraphicsItems을 그리고 이전 서브 윈도우에서는 그릴 수 없다.

나는 activeSubWindow()을 사용해야한다고 생각하지만 모든 서브 윈도우를 탭 변경에 응답하는 방법을 알 수 없었다. 어떻게 구현해야합니까?

+0

"이전 서브 윈도우에서 작업 할 수 없게된다는 것을 의미합니까?" – vahancho

+0

@vahancho 나는 편집하고 예제를 들었다. –

+1

그래픽 장면의 포인터를 사용하여 새로운 뷰 생성시이를 업데이트한다고 생각합니다. 하위 창을 활성화 할 때 업데이트해야합니다. 'QMdiArea :: subWindowActivated()'신호를 사용해보십시오. – vahancho

답변

0

작동하려면.

서브 윈도우와 뷰 쌍을 저장하기 위해 QList<QPair>을 만들었습니다.

windowViewList.append(qMakePair(w, view)); 

그러면 subWindowActivated() 신호는 뷰 포인터를 업데이트하기 위해 다음 함수를 호출하는 데 사용됩니다.

void MainWindow::updatePointers() 
{ 
    QMdiSubWindow *m = mdiArea->activeSubWindow(); 
    foreach (windowViewPair v, windowViewList) 
    { 
    if (m == v.first) 
     gv = v.second; 
    } 
}