2014-12-01 3 views
1

У меня есть приложение MDI, с классами какQMdi подокон переключение

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

Я создаю новый mdiSubWindow на каждый newfile() из MainWindow, который создает новый указатель на GraphicsView.

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

И конструктор GraphicsView создает новую сцену.

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

Теперь, когда создано несколько подзаголовков, я теряю возможность работать в предыдущих подзаголовках. Только последний подзаголовок работает так, как ожидалось. Напр. Я могу нарисовать QGraphicsItems только в последней под Windows, а не в предыдущих.

Я думаю, что я должен использовать activeSubWindow(), но не мог понять, как заставить каждый subWindow реагировать на изменение вкладок. Как мне это реализовать?

+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; 
    } 
}