Реализация Qt Undo / Redo, не может подключиться к кнопке

Я также отправляю вопрос на форуме 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 или в стиле функции

Кто-нибудь может мне помочь? Спасибо

0

Решение

Ваш 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 ().

1

Другие решения


По вопросам рекламы [email protected]