Undo stack remains empty in Qt

I am trying to undo / redo in a multi-document interface. I have different entities. Each object has its own class. I used UndoGroup, but when I couldn't push them to undoStack, I don't know what's wrong there. Can anyone help me solve the problem.

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

      

I am confused as to why I cannot push entities to cancel. Please help me to solve this problem.

+3


source to share


1 answer


I think the problem lies with these two functions (see inline comments):



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


source







All Articles