Я также отправляю вопрос на форуме Qt, Вот
Я пытаюсь реализовать команды отмены и повтора в моем приложении. У меня есть QTreeWidget, и я хотел бы позволить пользователю отменить и повторить действие (например, изменить значение в столбцах QTreeWidgetItem в QTreeWidget и отменить / повторить его).
Вот часть моего кода:
класс А.ч
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
класс 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, оно автоматически отображает предыдущее значение. Более того, я хотел бы соединить функции отмены и возврата с двумя кнопками, но компилятор говорит, что
1543: ошибка: C2664: «QMetaObject :: Connection QObject :: connect (const QObject *, const char *, const QObject *, const char *, Qt :: ConnectionType)» ÿ: невозможно преобразовать параметр 3 из «ChangeValueTreeCommand *» в ‘const QObject *’
Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, приведения в стиле C или в стиле функции
Кто-нибудь может мне помочь? Спасибо
Ваш 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 ().