2014-12-15 2 views
3

Я пытаюсь отменить/повторить в интерфейсе нескольких документов. У меня разные сущности. У каждого объекта есть свой класс. Я использовал UndoGroup, но когда я не смог нажать их на undoStack, не знаю, что там не так. Может ли кто-нибудь помочь мне решить проблему.Undo stack остается пустым в Qt

cadgraphicscene.cpp

CadGraphicsView::CadGraphicsView() 
{ 
    undoStack = new QUndoStack(this); 
} 

QUndoStack *CadGraphicsView::m_undoStack() const 
{ 
    return undoStack; 
} 

void CadGraphicsView::showUndoStack() 
{   
    undoView = 0; 
    // shows the undoStack window 
    if (undoView == 0) 
    { 
     undoView = new QUndoView(undoStack); 
     undoView->setWindowTitle("Undo Stack"); 
    } 

    undoView->show(); 
} 

mainwindow.cpp

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(1), undoAction); 
    menuEdit->insertAction(undoAction, redoAction); 
    menuEdit->addAction(undoAction); 
    menuEdit->addAction(redoAction); 
    undoAction->setEnabled(true); 
    redoAction->setEnabled(true); 
} 

void MainWindow::updateActions() 
{ 
    CadGraphicsView *view = currentDocument(); 
    m_undoGroup->setActiveStack(view == 0 ? 0 : view->m_undoStack()); 
} 

void MainWindow::addDocument(CadGraphicsView *view) 
{ 
    m_undoGroup->addStack(view->m_undoStack()); 
    connect(view->m_undoStack(), SIGNAL(indexChanged(int)), this, SLOT(updateActions())); 
    connect(view->m_undoStack(), SIGNAL(cleanChanged(bool)), this, SLOT(updateActions())); 

    setCurrentDocument(view); 
} 

void MainWindow::setCurrentDocument(CadGraphicsView *view) 
{ 
    mdiArea->currentSubWindow(); 
} 

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

Я запутался с тем, почему я не в состоянии подтолкнуть лиц к undoStack. Пожалуйста, помогите мне решить эту проблему

ответ

0

Я думаю, что проблема в этих двух функциях (см инлайн комментариев):

void MainWindow::setCurrentDocument(CadGraphicsView *view) 
{ 
    // The view argument is not used at all. You do not set anything here. 
    mdiArea->currentSubWindow(); 
} 

CadGraphicsView *MainWindow::currentDocument() const 
{ 
    // mdiArea->parentWidget() returns the MainWindow, so this function 
    // always returns 0. 
    return qobject_cast<CadGraphicsView *>(mdiArea->parentWidget()); 

    // You should write it as 
    // return qobject_cast<CadGraphicsView *>(mdiArea->activeSubWindow()->widget()); 
} 
+0

Когда я изменяю currentDocument() в главном окне я получаю следующее сообщение об ошибке: недопустимое использование неполного типа 'класс QMdiSubWindow' return qobject_cast (mdiArea-> activeSubWindow() -> widget()); – user4345796

+0

@ user4345796, добавьте '#include '. – vahancho

+0

После включения моей программы произошел сбой. Помогите мне решить этот – user4345796