我也在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
答案 0 :(得分:1)
您的undo
和redo
按钮应致电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()。