2014-12-11 2 views
-1

Я пытаюсь сделать откат/повтор на Многодокументный интерфейс, но перед следующей ошибки:Ошибка при попытке Undo Redo

no matching function for call to 'qobject_cast(QMdiSubWindow*&)' 
     return qobject_cast<CadGraphicsView *>(activeSubWindow); 

Мой код выше функции выглядит следующим образом:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
    { 
     m_undoGroup = new QUndoGroup(this); 
     QAction *undoAction = m_undoGroup->createUndoAction(this); 
     undoAction->setShortcut(QKeySequence::Undo); 
     QAction *redoAction = m_undoGroup->createRedoAction(this); 
     redoAction->setShortcut(QKeySequence::Redo); 
     menuEdit->insertAction(menuEdit->actions().at(0), undoAction); 
     menuEdit->insertAction(undoAction, redoAction); 
     menuEdit->addAction(undoAction); 
     menuEdit->addAction(redoAction); 
     updateActions(); 
    } 
       void MainWindow::setCurrentDocument() 
      { 
       mdiArea->currentSubWindow(); 
      } 

      void MainWindow::addnewFile() 
      { 
       m_undoGroup->addStack(view->scene->undoStack()); 
       connect(view->scene->undoStack(), SIGNAL(indexChanged(int)), this, SLOT(updateActions())); 
       connect(view->scene->undoStack(), SIGNAL(cleanChanged(bool)), this, SLOT(updateActions())); 
      } 

      void MainWindow::updateActions() 
      { 
       CadGraphicsScene *scene = currentDocument(); 
       m_undoGroup->setActiveStack(scene == 0 ? 0 : scene->undoStack()); 
      } 

     CadGraphicsView *MainWindow::currentDocument() const 
     { 
     if (QMdiSubWindow *activeSubWindow = mdiArea->currentSubWindow()) 
       return qobject_cast<CadGraphicsView *>(activeSubWindow); 

      return 0; 
     } 

     void MainWindow::newFile() 
     { 
      // creates a new file 
      createMdiView(); 

      view->newFile(); 
      addnewFile(); 
      curFileName = tr("Document %1").arg(++fileNumber); 
      view->setWindowTitle(curFileName); 
      view->scene->installEventFilter(this); 
      view->show(); 

      isEntitySelected = false; 
     } 

     CadGraphicsView *MainWindow::createMdiView() 
     { 
      // creates a graphicsView and add it to the MDI window 
      view = new CadGraphicsView; 
      QMdiSubWindow *w = mdiArea->addSubWindow(view); 
      mdiArea->setActiveSubWindow(w); 
      windowViewList.append(qMakePair(w, view)); 

обратный вид; }

Не могли бы вы помочь мне решить эту проблему. Я добавил основную идею, как она работает.

+0

Возможно, вы вызываете setActions() более одного раза? Вы это подтвердили? –

+0

Он вызывается каждый раз, когда мы вызываем функцию newFile(). Но я хочу, чтобы, когда он пришел только один раз, но работает для всех файлов – user4345796

+0

Можете ли вы вставить простой тестовый пример, который воспроизводит проблему? – lpapp

ответ

0

Получил решение моей проблемы. Мне нужно изменить функцию currentDocument следующим образом:

CadGraphicsView *MainWindow::currentDocument() const 
{ 
    return qobject_cast<CadGraphicsView *>(mdiArea->parentWidget()); 
}