Отменить / Повторить в QTextEdit - PullRequest
0 голосов
/ 14 апреля 2019

Программа, которую я создаю, включает в себя QTextEdit часть. Я хочу выполнить следующую функцию:

  1. Когда я пытаюсь нажать на элемент QAction, играющий роль Отменить , тогда когда будет достигнут конец истории треков Undo , должно быть возвращено конкретное значение (bool или int) . После успешного выполнения этой (приведенной выше команды), как я полагаю, будут реализованы другие команды.

  2. То же самое необходимо выполнить для Повторить .

Спасибо.

1 Ответ

1 голос
/ 14 апреля 2019

Из документации Qt QTextEdit вы можете найти действия redo и undo. Также вы можете проверить, доступны ли значения redo или undo через сигналы redoAvailable и undoAvailable.

Для реализации действий вы можете зарегистрироваться, используя сигнал / слот.

Например:

#include <QVBoxLayout>
#include <QPushButton>
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QPushButton *poUndo     = new QPushButton("Undo", this);
    QPushButton *poRedo     = new QPushButton("Redo", this);
    QTextEdit   *poTextEdit = new QTextEdit(this);
    QHBoxLayout *poHlayout  = new QHBoxLayout;

    QLabel * poLabelRedoAvaliable = new QLabel(this);
    QLabel * poLabelUndoAvaliable = new QLabel(this);


    // add undo/redo buttons
    poHlayout->addWidget(poRedo);
    poHlayout->addWidget(poUndo);

    QVBoxLayout *poVLayout  = new QVBoxLayout;
    poVLayout->addWidget(poTextEdit); // add text edit
    poVLayout->addLayout(poHlayout);

    // redo/undo avaliable status
    poVLayout->addWidget(poLabelRedoAvaliable);
    poVLayout->addWidget(poLabelUndoAvaliable);

    // main central widget
    QWidget *poCentral  = new QWidget(this);
    poCentral->setLayout(poVLayout);
    this->setCentralWidget(poCentral);

    // register the undo/redo actions actions
    connect(poUndo, &QPushButton::clicked,  poTextEdit, &QTextEdit::undo);
    connect(poRedo, &QPushButton::clicked,  poTextEdit, &QTextEdit::redo);

    connect(poTextEdit, &QTextEdit::redoAvailable,
            [poLabelRedoAvaliable](bool bAvailable)
    {
        if (bAvailable)
        {
            poLabelRedoAvaliable->setText("redo available");
        }
        else {
            poLabelRedoAvaliable->setText("redo not available");
        }
    });

    connect(poTextEdit, &QTextEdit::undoAvailable,
            [poLabelUndoAvaliable](bool bAvailable)
    {
        if (bAvailable)
        {
            poLabelUndoAvaliable->setText("undo available");
        }
        else {
            poLabelUndoAvaliable->setText("undo not available");
        }
    });

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...