⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qundostack.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include <QtCore/qdebug.h>#include "qundostack.h"#include "qundogroup.h"#include "qundostack_p.h"#ifndef QT_NO_UNDOCOMMAND/*!    \class QUndoCommand    \brief The QUndoCommand class is the base class of all commands stored on a QUndoStack.    \since 4.2    \ingroup misc    For an overview of Qt's Undo Framework, see the    \l{Overview of Qt's Undo Framework}{overview document}.    A QUndoCommand represents a single editing action on a document; for example,    inserting or deleting a block of text in a text editor. QUndoCommand can apply    a change to the document with redo() and undo the change with undo(). The    implementations for these functions must be provided in a derived class.    \code    class AppendText : public QUndoCommand    {    public:        AppendText(QString *doc, const QString &text)            : m_document(doc), m_text(text) { setText("append text"); }        virtual void undo()            { m_document->chop(m_text.length()); }        virtual void redo()            { m_document->append(m_text); }    private:        QString *m_document;        QString m_text;    };    \endcode    A QUndoCommand has an associated text(). This is a short string    describing what the command does. It is used to update the text    properties of the stack's undo and redo actions; see    QUndoStack::createUndoAction() and QUndoStack::createRedoAction().    QUndoCommand objects are owned by the stack they were pushed on.    QUndoStack deletes a command if it has been undone and a new command is pushed. For example:\code    MyCommand *command1 = new MyCommand();    stack->push(command1);    MyCommand *command2 = new MyCommand();    stack->push(command2);    stack->undo();    MyCommand *command3 = new MyCommand();    stack->push(command3); // command2 gets deleted\endcode    In effect, when a command is pushed, it becomes the top-most command    on the stack.    To support command compression, QUndoCommand has an id() and the virtual function    mergeWith(). These functions are used by QUndoStack::push().    To support command macros, a QUndoCommand object can have any number of child    commands. Undoing or redoing the parent command will cause the child    commands to be undone or redone. A command can be assigned    to a parent explicitly in the constructor. In this case, the command    will be owned by the parent.    The parent in this case is usually an empty command, in that it doesn't    provide its own implementation of undo() and redo(). Instead, it uses    the base implementations of these functions, which simply call undo() or    redo() on all its children. The parent should, however, have a meaningful    text().    \code    QUndoCommand *insertRed = new QUndoCommand(); // an empty command    insertRed->setText("insert red text");    new InsertText(document, idx, text, insertRed); // becomes child of insertRed    new SetColor(document, idx, text.length(), Qt::red, insertRed);    stack.push(insertRed);    \endcode    Another way to create macros is to use the convenience functions    QUndoStack::beginMacro() and QUndoStack::endMacro().    \sa QUndoStack*//*!    Constructs a QUndoCommand object with the given \a parent and \a text.    If \a parent is not 0, this command is appended to parent's child list.    The parent command then owns this command and will delete it in its    destructor.    \sa ~QUndoCommand()*/QUndoCommand::QUndoCommand(const QString &text, QUndoCommand *parent){    d = new QUndoCommandPrivate;    if (parent != 0)        parent->d->child_list.append(this);    d->text = text;}/*!    Constructs a QUndoCommand object with parent \a parent.    If \a parent is not 0, this command is appended to parent's child list.    The parent command then owns this command and will delete it in its    destructor.    \sa ~QUndoCommand()*/QUndoCommand::QUndoCommand(QUndoCommand *parent){    d = new QUndoCommandPrivate;    if (parent != 0)        parent->d->child_list.append(this);}/*!    Destroys the QUndoCommand object and all child commands.    \sa QUndoCommand()*/QUndoCommand::~QUndoCommand(){    qDeleteAll(d->child_list);    delete d;}/*!    Returns the ID of this command.    A command ID is used in command compression. It must be an integer unique to    this command's class, or -1 if the command doesn't support compression.    If the command supports compression this function must be overridden in the    derived class to return the correct ID. The base implementation returns -1.    QUndoStack::push() will only try to merge two commands if they have the    same ID, and the ID is not -1.    \sa mergeWith(), QUndoStack::push()*/int QUndoCommand::id() const{    return -1;}/*!    Attempts to merge this command with \a command. Returns true on    success; otherwise returns false.    If this function returns true, calling this command's redo() must have the same    effect as redoing both this command and \a command.    Similarly, calling this command's undo() must have the same effect as undoing    \a command and this command.    QUndoStack will only try to merge two commands if they have the same id, and    the id is not -1.    The default implementation returns false.    \code    bool AppendText::mergeWith(const QUndoCommand *other)    {        if (other->id() != id()) // make sure other is also an AppendText command            return false;        m_text += static_cast<const AppendText*>(other)->m_text;        return true;    }    \endcode    \sa id() QUndoStack::push()*/bool QUndoCommand::mergeWith(const QUndoCommand *command){    Q_UNUSED(command);    return false;}/*!    Applies a change to the document. This function must be implemented in    the derived class. Calling QUndoStack::push(),    QUndoStack::undo() or QUndoStack::redo() from this function leads to    undefined beahavior.    The default implementation calls redo() on all child commands.    \sa undo()*/void QUndoCommand::redo(){    for (int i = 0; i < d->child_list.size(); ++i)        d->child_list.at(i)->redo();}/*!    Reverts a change to the document. After undo() is called, the state of    the document should be the same as before redo() was called. This function must    be implemented in the derived class. Calling QUndoStack::push(),    QUndoStack::undo() or QUndoStack::redo() from this function leads to    undefined beahavior.    The default implementation calls undo() on all child commands in reverse order.    \sa redo()*/void QUndoCommand::undo(){    for (int i = d->child_list.size() - 1; i >= 0; --i)        d->child_list.at(i)->undo();}/*!    Returns a short text string describing what this command does; for example,    "insert text".    The text is used when the text properties of the stack's undo and redo    actions are updated.    \sa setText(), QUndoStack::createUndoAction(), QUndoStack::createRedoAction()*/QString QUndoCommand::text() const{    return d->text;}/*!    Sets the command's text to be the \a text specified.    The specified text should be a short user-readable string describing what this    command does.    \sa text() QUndoStack::createUndoAction() QUndoStack::createRedoAction()*/void QUndoCommand::setText(const QString &text){    d->text = text;}#endif // QT_NO_UNDOCOMMAND#ifndef QT_NO_UNDOSTACK/*!    \class QUndoStack    \brief The QUndoStack class is a stack of QUndoCommand objects.    \since 4.2    \ingroup misc    For an overview of Qt's Undo Framework, see the    \l{Overview of Qt's Undo Framework}{overview document}.    An undo stack maintains a stack of commands that have been applied to a    document.    New commands are pushed on the stack using push(). Commands can be    undone and redone using undo() and redo(), or by triggering the    actions returned by createUndoAction() and createRedoAction().    QUndoStack keeps track of the \a current command. This is the command    which will be executed by the next call to redo(). The index of this    command is returned by index(). The state of the edited object can be    rolled forward or back using setIndex(). If the top-most command on the    stack has already been redone, index() is equal to count().    QUndoStack provides support for undo and redo actions, command    compression, command macros, and supports the concept of a    \e{clean state}.    \section1 Undo and Redo Actions    QUndoStack provides convenient undo and redo QAction objects, which    can be inserted into a menu or a toolbar. When commands are undone or    redone, QUndoStack updates the text properties of these actions    to reflect what change they will trigger. The actions are also disabled    when no command is available for undo or redo. These actions    are returned by QUndoStack::createUndoAction() and QUndoStack::createRedoAction().    \section1 Command Compression and Macros    Command compression is useful when several commands can be compressed    into a single command that can be undone and redone in a single operation.    For example, when a user types a character in a text editor, a new command    is created. This command inserts the character into the document at the    cursor position. However, it is more convenient for the user to be able    to undo or redo typing of whole words, sentences, or paragraphs.    Command compression allows these single-character commands to be merged    into a single command which inserts or deletes sections of text.    For more information, see QUndoCommand::mergeWith() and push().    A command macro is a sequence of commands, all of which are undone and    redone in one go. Command macros are created by giving a command a list    of child commands.    Undoing or redoing the parent command will cause the child commands to    be undone or redone. Command macros may be created explicitly    by specifying a parent in the QUndoCommand constructor, or by using the    convenience functions beginMacro() and endMacro().    Although command compression and macros appear to have the same effect to the    user, they often have different uses in an application. Commands that    perform small changes to a document may be usefully compressed if there is    no need to individually record them, and if only larger changes are relevant    to the user.    However, for commands that need to be recorded individually, or those that    cannot be compressed, it is useful to use macros to provide a more convenient    user experience while maintaining a record of each command.    \section1 Clean State    QUndoStack supports the concept of a clean state. When the    document is saved to disk, the stack can be marked as clean using    setClean(). Whenever the stack returns to this state through undoing and    redoing commands, it emits the signal cleanChanged(). This signal    is also emitted when the stack leaves the clean state. This signal is    usually used to enable and disable the save actions in the application,    and to update the document's title to reflect that it contains unsaved    changes.    \sa QUndoCommand, QUndoView*/#ifndef QT_NO_ACTION

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -