Qt中的撤消堆栈仍为空

时间:2014-12-15 06:41:43

标签: c++ qt

我正在尝试在多文档界面中撤消/重做。我有不同的实体。每个实体都有自己的类。我使用过UndoGroup但是当我无法将它们推送到undoStack时,我不知道那里有什么问题。任何人都可以帮我解决这个问题。

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。请帮我解决这个问题

1 个答案:

答案 0 :(得分: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());
}