Qt Undo / Redo实现,无法连接到按钮

时间:2015-01-28 15:01:09

标签: c++ qt undo-redo

我也在Qt论坛here

中发布了这个问题

我正在尝试在我的应用程序中实现撤消和重做命令。我有一个QTreeWidget,我想让用户撤消并重做一个动作(例如,在QTreeWidget中更改QTreeWidgetItem列中的值并撤消/重做它)。

这是我的部分代码:

班A.h

    class A : public QWidget
{
    Q_OBJECT
public:
    explicit A(...);
    ~A();

    ChangeValueTreeCommand      *commands;
    QUndoStack                  *undoStack;
    QPushButton                 *undoBtn;
    QPushButton                 *redoBtn;
    QString                      newValue;

    void changeItem(QTreeWidgetItem* treeWidgetItemChanged, int col);
};

A.cpp类

A::A(...){
undoStack = new QUndoStack(this);
}

void A::changeItem(QTreeWidgetItem* treeWidgetItemChanged, int col){

     ....
    commands = new ChangeValueTreeCommand(treeWidgetItemChanged, col, newValue);
    connect(undoBtn, SIGNAL(clicked()), commands, SLOT(undo()));
    undoStack->push(commands);

}

类Commands.h

    #ifndef COMMANDS_H
#define COMMANDS_H

#include <QApplication>

#include <QUndoCommand>
#include <QTreeWidgetItem>


class ChangeValueTreeCommand : public QUndoCommand
{
public:
    explicit ChangeValueTreeCommand(QTreeWidgetItem* treeWI = NULL, int c = 0, const QString changedV = "");
    ~ChangeValueTreeCommand();

    QTreeWidgetItem* treeWItem;
    const QString    changedValue;
    int col;

public slots:

    void undo();
    void redo();
};


#endif // COMMANDS_H

class Commands.cpp

    #include "Commands.h"

ChangeValueTreeCommand::ChangeValueTreeCommand(QTreeWidgetItem* treeWI, int c, const QString changedV)
        : treeWItem(treeWI), col(c), changedValue(changedV)

{}

ChangeValueTreeCommand::~ChangeValueTreeCommand(){}

void ChangeValueTreeCommand::undo()
{
    const QString oldValue = treeWItem->text(col);
    treeWItem->setText(col, oldValue);
}

void ChangeValueTreeCommand::redo()
{
    treeWItem->setText(col, changedValue);
}

问题是当用户更改QTreeWidgetItem中的值时,它会自动显示前一个值。此外,我想将undo和redo函数连接到两个按钮,但编译器说

  

1543:错误:C2664:'QMetaObject :: Connection QObject :: connect(const QObject *,const char *,const QObject *,const char *,Qt :: ConnectionType)'ÿ:无法从'ChangeValueTreeCommand转换参数3 *'到'const QObject *'   指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换

有人能帮助我吗? THX

1 个答案:

答案 0 :(得分:1)

您的undoredo按钮应致电undoStack->undo() / undoStack->redo()。这将移动堆栈指针,并将调用当前命令的undo / redo函数。

有关详细说明,请参阅Qt文档:http://qt-project.org/doc/qt-4.8/qundostack.html#undo

特别是这部分:

  

使用push()将新命令压入堆栈。命令可以   使用undo()和redo()撤消和重做,或者通过触发   createUndoAction()和createRedoAction()返回的动作。

     

QUndoStack跟踪当前命令。这是命令   这将在下一次调用redo()时执行。这个指数   index()返回命令。编辑对象的状态可以是   使用setIndex()向前或向后滚动。如果最顶层的命令   堆栈已经重做,index()等于count()。