Qt中撤销栈为空

3
我正在尝试在多文档界面中撤销/重做。我有不同的实体,每个实体都有自己的类。我已经使用了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

我认为问题出在这两个函数中(请参见内联注释):

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());
}

当我在mainwindow中更改currentDocument()时,会出现以下错误:invalid use of incomplete type 'class QMdiSubWindow'。返回qobject_cast<CadGraphicsView *>(mdiArea->activeSubWindow()->widget()); - user4345796
@user4345796,请添加 #include <QMdiSubWindow> - vahancho
包含我的程序之后崩溃了。请帮我解决这个问题。 - user4345796
@user4345796,抱歉,我不能为您调试它。提示:检查此调用链返回的所有指针mdiArea->activeSubWindow()->widget()是否为空。 - vahancho
我执行了mdiArea.activeSubWindow,但它仍未进入堆栈。 - user4345796

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接