QT6 源(103)篇三:阅读与注释 QPlainTextEdit,给出源代码

(10)关于文本处理的内容很多,来不及全面阅读、思考与整理。先给出类的继承图:

在这里插入图片描述

(11)本源代码来自于头文件 qplaintextedit . h

#ifndef QPLAINTEXTEDIT_H
#define QPLAINTEXTEDIT_H

#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qtextedit.h>

#include <QtWidgets/qabstractscrollarea.h>
#include <QtGui/qtextdocument.h>
#include <QtGui/qtextoption.h>
#include <QtGui/qtextcursor.h>
#include <QtGui/qtextformat.h>
#include <QtGui/qabstracttextdocumentlayout.h>

QT_REQUIRE_CONFIG(textedit);

QT_BEGIN_NAMESPACE

class QStyleSheet;
class QTextDocument;
class QMenu;
class QPlainTextEditPrivate;
class QMimeData;
class QPagedPaintDevice;
class QRegularExpression;


/*
The QPlainTextEdit class provides a widget that is used to edit and display plain text.

QPlainTextEdit 是一个支持纯文本的高级查看器/编辑器。它经过优化,可以处理大型文档并快速响应用户输入。
QPlainText 使用与 QTextEdit 非常相似的技术和概念,但针对纯文本处理进行了优化。
QPlainTextEdit 适用于段落和字符。段落是一种格式化字符串,它会换行以适应控件的宽度。
默认情况下,在读取纯文本时,一个换行符表示一个段落。文档由零个或多个段落组成。段落之间由硬行分隔。
段落中的每个字符都有自己的属性,例如字体和颜色。

默认情况下,QPlainTextEdit上的鼠标光标形状为Qt::BeamCursor。
它可以通过viewport()的cursor属性进行更改。

Using QPlainTextEdit as a Display Widget
设置或替换,该方法会删除现有文本并用传递给setPlainText()的文文本使用 setPlainText()本替换它。
可以使用 QTextCursor类或使用insertPlainText()、appendPlainText()或paste()方便函数来插入文本。
默认情况下,文本编辑器会在空格处折行以适合文本编辑器小部件。
setLineWrapMode()函数用于指定您想要的行折方式,如果您不想有任何折行,则使用WidgetWidth或NoWrap。
如果您使用wordWrap将文本折行到小部件的宽度WidgetWidth,
则可以使用setWordWrapMode()指定是否在空格处或任何地方折行。

find() 函数可用于在文本中查找和选择给定的字符串。
如果要限制 QPlainTextEdit 中的段落总数,例如它在日志查看器中很有用,则可以使用maximumBlockCount属性。
setMaximumBlockCount()和appendPlainText()的组合使QPlainTextEdit 成为日志文本的高效查看器。
可以使用 centerOnScroll()属性减少滚动,从而使日志查看器更快。
文本可以以有限的方式格式化,可以使用语法高亮工具(见下文),也可以使用appendHtml()附加 html格式的文本。
虽然QPlainTextEdit不支持复杂的富文本渲染和表格和浮动,
但它支持有限的基于段落的格式,您可能需要在日志查看器中使用。

Read-only Key Bindings:
当QPlainTextEdit被设置为只读时,键绑定仅限于导航,并且只能使用鼠标选择文本:
    //快捷键略

Using QPlainTextEdit as an Editor:
有关使用QPlainTextEdit作为显示小部件的所有信息也适用于此。
文本的选择由 QTextCursor类处理,它提供了创建选择、检索文本内容或删除选择的功能。
您可以使用 textCursor()方法检索与用户可见光标对应的对象。
如果您想在OPlainTextEdit 中设置一个选择,
只需在 QTextCursor对象上创建一个,然后使用 setCursol()将该光标设置为可见光标。
选择可以通过copy()复制到剪贴板,或者通过cut()剪切到剪贴板。可以使用 selectAll() 函数选择整个文本。

QPlainTextEdit持有一个 QTextDocument对象,可以使用 document()方法来检索。
您还可以使用 setDocument()方法设置自己的文档对象。
QTextDocument会在文本更改时发出textChanged()信号,
它还提供了一个isModified()函数,
如果文本自加载或自上次调用setModified ()且参数为 false 以来已更改,则该函数将返回 true。
此外,它还提供了撤销和重做的方法。

Syntax Highlighting:
Just like QTextEdit, QPlainTextEdit works together with QSyntaxHighlighter.

Editing Key Bindings:快捷键略
要选择(标记)文本,请按住Shift键并同时按下移动键,
例如,Shift+右箭头将选择右侧的字符,Shift+ctrl+右箭头将选择右侧的词,等等。

Differences to QTextEdit:
QPlainTextEdit是一个薄类,通过使用QTextEdit和QTextDocument背后的大多数技术来实现。
它的性能优势主要来自于在文本文档上使用称为QPlainTextDocumentLayout的不同且简化的文本布局
(参见QTextDocument:setDocumentLayout())。
纯文本文档布局不支持表格和嵌入式框架,并且用逐行逐段滚动的方法替换了像素精确的高度计算。
这使得可以处理大得多的文档,并且仍然可以实时调整编辑器的大小,同时启用行换行。
它还可以用于快速日志查看器(参见setMaximumBlockCount())。

*/

class Q_WIDGETS_EXPORT QPlainTextEdit : public QAbstractScrollArea
{
    Q_OBJECT

    Q_DECLARE_PRIVATE(QPlainTextEdit)

    //此属性获取和设置纯文本编辑器的内容。当设置此属性时,会删除之前的内容并重置撤销/重做历史。
    //currentCharFormat()也会被重置,除非textCursor()已经在文档的开头。
    //默认情况下,对于没有内容的编辑器,此属性包含空字符串。
    Q_PROPERTY(QString    plainText     //代表文本框里的全部内容
                READ    toPlainText   WRITE  setPlainText
                NOTIFY         textChanged USER true)

    Q_PROPERTY(QString placeholderText READ placeholderText WRITE setPlaceholderText)
    //此属性包含编辑器占位符文本。 设置此属性将使编辑器在文档()为空时显示灰色占位符文本。
    //默认情况下,此属性包含一个空字符串。

    //这个属性持有从文本解析的文档的标题。默认情况下,此属性包含一个空字符串。获取文档的标题。
    Q_PROPERTY(QString documentTitle READ documentTitle WRITE setDocumentTitle)

    //此属性表示文本编辑器是否为只读。
    //在只读文本编辑器中,用户只能浏览文本并选择文本;无法修改文本。 此属性的默认值为false。
    Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)

    //此属性指定光标的像素宽度。默认值为 1。  //本属性描述光标的宽度,越宽越明显
    Q_PROPERTY(int  cursorWidth  READ  cursorWidth  WRITE  setCursorWidth)

    //此属性存储文档中文本块的数量。 默认情况下,在空文档中,此属性包含值为 1。
    Q_PROPERTY(int  blockCount   READ   blockCount) // QT 会把空行也算进去

    Q_PROPERTY(int       maximumBlockCount
                READ     maximumBlockCount  WRITE  setMaximumBlockCount)
    //此属性存储文档中块的限制。指定文档可能具有的最大块数。
    //如果文档中包含更多块,则使用此属性指定的块将从文档开头删除。
    //负数或零值表示文档可能包含无限数量的块。缺省值为0。
    //请注意,设置此属性将立即将限制应用于文档内容。设置此属性还会禁用撤销重做历史记录。
    //Setting this property also disables the undo redo history.

    //此属性表示调色板背景是否可见于文档区域之外。
    //如果设置为true,纯文本编辑会在文本文档未覆盖的视口区域绘制调色板背景。否则,如果设置为false,则不会。
    //该功能使用户能够视觉上区分文档区域(使用调色板的基色绘制和任何文档未覆盖的空闲区域。
    Q_PROPERTY(bool      backgroundVisible  //默认值是假的。
                READ     backgroundVisible  WRITE  setBackgroundVisible)

    //This property holds whether Tab changes focus or is accepted as input。
    //无论选项卡是否改变焦点或被接受为输入,该属性都保持不变。
    //在某些情况下,文本编辑不应允许用户输入制表符或使用Tab键更改缩进,因为这破坏了焦点链。默认值为false。
    Q_PROPERTY(bool      tabChangesFocus  //意思是不允许把tab键作为内容输入
                READ     tabChangesFocus   WRITE   setTabChangesFocus)

    Q_PROPERTY(qreal     tabStopDistance
                READ     tabStopDistance   WRITE   setTabStopDistance)
    //此属性存储以像素为单位的制表符停止距离。  默认情况下,此属性包含80像素的值。 // 80 pixels
    //不要设置小于QChar::VisualTabCharacter字符的horizontalAdvance()的值,否则制表符将绘制不完全。


    //此属性表示是否启用了撤销和重做。 默认情况下,此属性为true。
    //只有当此属性为真,并且存在可以撤销(或重做)的操作时,用户才能撤销或重做操作。
    Q_PROPERTY(bool      undoRedoEnabled
                READ   isUndoRedoEnabled   WRITE   setUndoRedoEnabled)

    //enum QPlainTextEdit::LineWrapMode { NoWrap, WidgetWidth };就定义在本类里
    //此属性保存行换行模式。 默认模式是WidgetWidth,它使单词在文本编辑器的右侧边缘进行换行。
    //换行发生在空格处保持整个单词完整。如果您想在单词内进行换行,请使用setWordWrapMode()函数。
    Q_PROPERTY(LineWrapMode   lineWrapMode
                READ          lineWrapMode  WRITE  setLineWrapMode)

    //enum QTextOption::WrapMode { NoWrap, WordWrap, ManualWrap, WrapAnywhere,
    //                                        WrapAtWordBoundaryOrAnywhere     };
    QDOC_PROPERTY(QTextOption::WrapMode   wordWrapMode
                READ                      wordWrapMode  WRITE  setWordWrapMode)
    //This property holds the mode QPlainTextEdit will use when wrapping text by words。
    //默认情况下,此属性设置为 QTextOption::WrapAtWordBoundaryOrAnywhere。


    Q_PROPERTY(bool          overwriteMode //指定当光标在文本中间时的输入是插入还是替换。
                READ         overwriteMode   WRITE   setOverwriteMode)
    //这个属性表示用户输入的文本是否会覆盖现有文本。
    //与许多文本编辑器一样,纯文本编辑器小部件可以配置为通过用户输入的新文本插入或覆盖现有文本。
    //如果此属性为真,则现有文本将被新文本逐字覆盖;否则,文本将插入光标位置,取代现有文本。
    //默认情况下,此属性为假(新文本不会覆盖现有文本)


//enum TextInteractionFlag { TextSelectableByMouse = 1, TextSelectableByKeyboard = 2...}
    Q_PROPERTY(Qt::TextInteractionFlags     textInteractionFlags  //只读与可写时,
                READ                        textInteractionFlags  //与人类的交互模式
                WRITE                    setTextInteractionFlags) //   是不一样的。
    //指定标签在显示文本时如何与用户输入交互。
    //如果这些标志包含 Qt:.LinksAccessibleByKeyboard 或 Qt:TextSelectableByKeyboard,
    //则焦点策略也将自动设置为 Qt::ClickFocus。
    //默认值取决于 QPlainTextEdit 是只读还是可编辑的。
    //经测试,当文本框只读时,本属性 = TextSelectableByMouse
//可写 = TextSelectableByMouse|TextSelectableByKeyboard|TextEditable|TextEditorinteraction
//定义:->TextSelectableByMouse|TextSelectableByKeyboard|TextEditable=TextEditorInteraction

    Q_PROPERTY(bool centerOnScroll READ centerOnScroll WRITE setCenterOnScroll) //滚屏速度
    //该属性表示光标是否应居中显示在屏幕上。默认值是假的。
    //如果设置为true,纯文本编辑将垂直滚动文档,使光标在视口中心可见。这还允许文本编辑在文档末尾下方滚动。
    //否则,如果设置为false,则纯文本编辑将滚动尽可能小的量,以确保光标可见。
    //相同的算法应用于通过appendPlainText()附加的任何新行。
    //总结:垂直滚屏时,本属性为 false则一次只滚动一行。为ture则一次滚动半屏幕,跳跃性很大。

private:
    Q_DISABLE_COPY(QPlainTextEdit)
    Q_PRIVATE_SLOT(d_func(), void _q_repaintContents(const QRectF &r))
    Q_PRIVATE_SLOT(d_func(), void _q_updatePlaceholderVisibility())
    Q_PRIVATE_SLOT(d_func(), void _q_adjustScrollbars())
    Q_PRIVATE_SLOT(d_func(), void _q_verticalScrollbarActionTriggered(int))
    Q_PRIVATE_SLOT(d_func(), void _q_cursorPositionChanged())

    friend class QPlainTextEditControl;

protected:
    QPlainTextEdit(QPlainTextEditPrivate & dd, QWidget * parent);

public:
    //Constructs an empty QPlainTextEdit with parent parent.
    explicit QPlainTextEdit(QWidget * parent = nullptr);
    explicit QPlainTextEdit(const QString & text, QWidget * parent = nullptr);
    //Constructs a QPlainTextEdit with parent parent.
    //The text edit will display the plain text text.

    virtual ~QPlainTextEdit();


//Q_PROPERTY(QString      plainText     //代表文本框里的全部内容
//              READ    toPlainText    WRITE   setPlainText
//            NOTIFY           textChanged USER true)
        inline QString  toPlainText() const
        { return document()->toPlainText(); }
public Q_SLOTS:
                void   setPlainText(const QString & text);
Q_SIGNALS:
                void           textChanged();

public:
//Q_PROPERTY(QString     placeholderText
//              READ     placeholderText    WRITE   setPlaceholderText)
             QString     placeholderText() const;
                void  setPlaceholderText(const QString & placeholderText);


//Q_PROPERTY(QString     documentTitle
//              READ     documentTitle    WRITE    setDocumentTitle)
    inline   QString     documentTitle() const
    { return document()->metaInformation(QTextDocument::DocumentTitle); }

    inline      void  setDocumentTitle(const QString &title)
    { document()->setMetaInformation(QTextDocument::DocumentTitle, title); }


//Q_PROPERTY(bool        readOnly    READ    isReadOnly     WRITE    setReadOnly)
             bool      isReadOnly() const;
             void     setReadOnly(bool ro);


//Q_PROPERTY(int     cursorWidth  READ  cursorWidth  WRITE  setCursorWidth) //光标的像素宽度
             int     cursorWidth() const;
             void setCursorWidth(int width);


//Q_PROPERTY(int  blockCount   READ   blockCount) // QT 会把空行也算进去。段落数量
             int  blockCount() const;

//Q_PROPERTY(int       maximumBlockCount          //最多允许输入几段
//           READ      maximumBlockCount   WRITE   setMaximumBlockCount)
    inline   int       maximumBlockCount() const
    { return document()->maximumBlockCount(); }

    inline   void   setMaximumBlockCount(int maximum)
    { document()->setMaximumBlockCount(maximum); }


//Q_PROPERTY(bool      backgroundVisible          //默认值是假的。不在空白区绘制背景色
//           READ      backgroundVisible   WRITE   setBackgroundVisible)
             bool      backgroundVisible() const;
             void   setBackgroundVisible(bool visible);


//Q_PROPERTY(bool      tabChangesFocus  //意思是不允许把tab键作为内容输入
//           READ      tabChangesFocus   WRITE   setTabChangesFocus)
             bool      tabChangesFocus() const;
             void   setTabChangesFocus(bool b);

//Q_PROPERTY(qreal     tabStopDistance  // tab键的跳跃距离,默认 80像素
//            READ     tabStopDistance   WRITE   setTabStopDistance)
             qreal     tabStopDistance() const;
             void   setTabStopDistance(qreal distance);

//Q_PROPERTY(bool      undoRedoEnabled
//           READ    isUndoRedoEnabled   WRITE   setUndoRedoEnabled)
    inline   bool    isUndoRedoEnabled() const
    { return document()->isUndoRedoEnabled(); }

    inline   void   setUndoRedoEnabled(bool enable)
    { document()->setUndoRedoEnabled(enable); }


    enum     LineWrapMode {
        NoWrap,
        WidgetWidth
    };
    Q_ENUM(  LineWrapMode  )
    //enum   QPlainTextEdit::LineWrapMode { NoWrap, WidgetWidth };就定义在本类里
//Q_PROPERTY(LineWrapMode    lineWrapMode  //描述如何换行,换行时是在空白处换行还是截断单词
//            READ           lineWrapMode   WRITE  setLineWrapMode)  //下同
             LineWrapMode    lineWrapMode() const;
              void        setLineWrapMode(LineWrapMode mode);


//enum QTextOption::WrapMode { NoWrap, WordWrap, ManualWrap, WrapAnywhere,
//                                        WrapAtWordBoundaryOrAnywhere     };
//QDOC_PROPERTY(QTextOption::WrapMode     wordWrapMode
//                  READ                  wordWrapMode   WRITE   setWordWrapMode)
                QTextOption::WrapMode     wordWrapMode() const;
                    void               setWordWrapMode(QTextOption::WrapMode policy);


//Q_PROPERTY(bool       overwriteMode //指定当光标在文本中间时的输入是插入还是替换。
//           READ       overwriteMode   WRITE   setOverwriteMode)
             bool       overwriteMode() const;
             void    setOverwriteMode(bool overwrite);


//enum TextInteractionFlag { TextSelectableByMouse = 1, TextSelectableByKeyboard = 2...}
//Q_PROPERTY(Qt::TextInteractionFlags     textInteractionFlags  //只读与可写时,
//           READ                         textInteractionFlags  //与人类的交互模式
//           WRITE                     setTextInteractionFlags) //   是不一样的。
             Qt::TextInteractionFlags textInteractionFlags() const;
             void setTextInteractionFlags(Qt::TextInteractionFlags flags);


//Q_PROPERTY(bool    centerOnScroll
//           READ    centerOnScroll    WRITE    setCenterOnScroll) //滚屏速度
             bool    centerOnScroll() const;
             void setCenterOnScroll(bool enabled);

    //class QTextDocument : public QObject 无力多看,先给个定义算了
    //Returns a pointer to the underlying document.
    QTextDocument  *     document() const;
    void              setDocument(QTextDocument * document);
    //Makes document the new document of the text editor.
    //提供的文档的父 QObject 仍然是对象的拥有者。如果当前文档是文本编辑器的子项,则将其删除。
    //该文档必须具有继承 QPlainTextDocumentLayout的文档布局
    //(请参阅 QTextDocument::setDocumentLayout())。

    //返回代表当前可见光标的 QTextCursor的副本。
    //请注意,返回的光标上的更改不会影响 QPlainTextEdit的光标;使用setTextCursor()来更新可见光标。
    QTextCursor          textCursor() const;  //class Q_GUI_EXPORT QTextCursor 这是其定义
    void              setTextCursor(const QTextCursor & cursor);
    //Sets the visible cursor.

    //class QTextCharFormat : public QTextFormat。
    //Returns the char format that is used when inserting new text.
    QTextCharFormat      currentCharFormat() const;      //使用案例见课本4.10章节的例题
    //Sets the char format that is be used when inserting new text to format by
    //  calling QTextCursor::setCharFormat() on the editor's cursor.
    //If the editor has a selection then the
    //  char format is directly applied to the selection.
    void              setCurrentCharFormat(const QTextCharFormat & format  );
    void            mergeCurrentCharFormat(const QTextCharFormat & modifier);
    //Merges the properties specified in modifier into the current character format by
    //  calling QTextCursor::mergeCharFormat on the editor's cursor.   //合并 Merges
    //If the editor has a selection then the
    //  properties of modifier are directly applied to the selection.

    //struct QTextEdit::ExtraSelection { QTextCursor cursor; QTextCharFormat format; };
    //Returns previously set extra selections. //以上是返回值的定义
    QList<QTextEdit::ExtraSelection> extraSelections() const;
    void setExtraSelections(const QList<QTextEdit::ExtraSelection> & selections);
    //This function allows temporarily marking certain regions in the
    //  document with a given color, specified as selections.
    //这可以在编程编辑器中很有用,例如用指定的背景色标记整行文本,以指示断点存在。

//enum QTextDocument::FindFlag { FindBackward=1, FindCaseSensitively=2, FindWholeWords=4 };
    bool find(const QRegularExpression & exp,
              QTextDocument::FindFlags options = QTextDocument::FindFlags());

    bool find(const QString            & exp, //枚举类 FindFlags = QFlags<FindFlag>
              QTextDocument::FindFlags options = QTextDocument::FindFlags());
    //Finds the next occurrence of the string, exp, using the given options.
    //Returns true if exp was found and changes the cursor to select the match;
    //otherwise returns false.

    //Returns the reference of the anchor at position pos,
    //or an empty string if no anchor exists at that point.
    QString anchorAt(const QPoint & pos) const; //这应该是超链接文本里用的成员功能函数,锚点

    //returns a QTextCursor at position pos (in viewport coordinates).
    QTextCursor      cursorForPosition(const QPoint      & pos   ) const;
    //returns a rectangle (in viewport coordinates) that includes the cursor.
    QRect            cursorRect       (const QTextCursor & cursor) const;
    QRect            cursorRect       () const;
    //returns a rectangle (in viewport coordinates) that includes the
    //  cursor of the text edit.
    void         moveCursor(QTextCursor::MoveOperation operation,
                    QTextCursor::MoveMode mode = QTextCursor::MoveAnchor);
    //enum QTextCursor::MoveOperation { ....,Up, Left, Down, Right,..... };
    //Moves the cursor by performing the given operation.
    //如果模式是 QTextCursor::KeepAnchor,则光标选择它移动过的文本。
    //这跟用户按下 Shift 键并使用光标键移动光标时获得的效果相同。

    //Returns whether text can be pasted from the clipboard into the textedit.
    bool canPaste() const;

    void print(QPagedPaintDevice * printer) const;
    //Convenience function to print the text edit's document to the given printer.
    //这相当于直接调用文档的打印方法,但此函数还支持QPrinter::Selection作为打印范围。

    //Ensures that the cursor is visible by scrolling the text edit if necessary.
    void ensureCursorVisible();

    virtual QVariant loadResource(int type, const QUrl & name);
    //Loads the resource specified by the given type and name.
    //This function is an extension of QTextDocument::loadResource().

    //这个函数创建标准上下文菜单,当用户用右键单击文本编辑器时显示。它从默认上下文菜单事件处理程序中调用。
    //弹出菜单的所有权被转移到调用者。
    //我们建议您使用 createStandardContextMenu(QPoint)版本,这将启用对用户点击位置敏感的操作。
    QMenu * createStandardContextMenu();
    QMenu * createStandardContextMenu(const QPoint & position);
    //这个函数创建标准上下文菜单,当用户用右键单击文本编辑器时显示。它从默认上下文菜单事件处理程序调用,
    //and it takes the position in document coordinates where the mouse click was.
    //这可以启用对用户点击位置敏感的操作。弹出菜单的所有权被转移到调用者。

    //Reimplements: QWidget::inputMethodQuery(Qt::InputMethodQuery query) const.
                QVariant inputMethodQuery(Qt::InputMethodQuery property) const override;

    Q_INVOKABLE QVariant inputMethodQuery(Qt::InputMethodQuery query,
                                            QVariant argument) const;

public Q_SLOTS:
    //void setPlainText(const QString &text);
    void cut  (); //将所选文本复制到剪贴板并从文本编辑器中删除它如果没有选择文本,则不会发生任何事情。
    void copy (); //将所选文本复制到剪贴板中。
    void paste();
    //将剪贴板中的文本粘贴到当前光标位置的文本编辑器中。如果剪贴板中没有文本,则不会发生任何操作。
    //要改变此函数的行为,即修改QPlainTextEdit可以粘贴的内容和粘贴方式,
    //请重新实现 virtualcanInsertFromMimeData()和 insertFromMimeData()函数。

    //撤销最后一次操作。如果没有撤销操作,即撤销/重做历史中没有撤销步骤,则不会发生任何操作。
    void undo();
    void redo(); //Redoes the last operation.

    //删除文本编辑框中的所有文本。注释:   撤销/重做历史记录也被清除。
    // currentCharFormat()被重置,除非textCursor()已经在文档的开头。
    void clear();
    void selectAll();  //Selects all text.

    //Convenience slot that inserts text at the current cursor position.
    //It is equivalent to:    edit->textCursor().insertText(text);
    void insertPlainText(const QString & text);
    void appendPlainText(const QString & text); //在末尾添加一个段落,另起一行的意思。
    //Appends a new paragraph with text to the end of the text edit.
    void appendHtml     (const QString & html); //超文本标记语言
    //Appends a new paragraph with html to the end of the text edit.

    void centerCursor(); //滚动文档以使光标垂直居中对齐。
    //Scrolls the document in order to center the cursor vertically.

    //Zooms in(out) on the text by making the base font size range points larger(smaller)
    //  and recalculating all font sizes to be the new size.
    //This does not change the size of any images.
    void zoomIn (int   range = 1); //放大
    void zoomOut(int   range = 1); //缩小
protected:
    void zoomInF(float range    ); //无注释

Q_SIGNALS:
    //每当文档内容更改时,都会发出此信号;例如,当插入或删除文本,或应用格式时。
    //void textChanged();

    //This signal is emitted whenever undo operations become available (available is true)
    //    or unavailable (available is false).
    void undoAvailable(bool available);
    void redoAvailable(bool available);
    //This signal is emitted whenever redo operations become available (available is true)
    //    or unavailable (available is false).

    //当在文本编辑器中选择或取消选择文本时,会发出此信号。
    //This signal is emitted when text is selected or de-selected in the text edit.
    //When text is selected this signal will be emitted with yes set to true.
    //If no text has been selected or if the selected text is de-selected ,
    //  this signal is emitted with yes set to false.
    //If yes is true  then copy() can be used to copy the selection to the clipboard.
    //If yes is false then copy() does nothing.
    void copyAvailable(bool yes);

    //This signal is emitted whenever the selection changes.
    void       selectionChanged();
    void  cursorPositionChanged();
    //This signal is emitted whenever the position of the cursor changed.

    //This signal is emitted whenever the block count changes.
    //The new block count is passed in newBlockCount.
    void      blockCountChanged(int   newBlockCount);
    void    modificationChanged(bool  changed);
    //每当文档内容以影响修改状态的方式更改时,都会发出此信号。
    //如果 changed为true,则表示文档已修改否则为 false。
    //例如,在文档上调用 setModified(false)并且随后插入文本会导致信号被发出。
    //如果您撤销该操作,使文档返回到其原始的未修改状态,则信号将再次被发出。

    void updateRequest(const QRect & rect, int dy);
    //This signal is emitted when the text document needs an update of the specified rect.
    //If the text is scrolled, rect will cover the entire viewport area.
    //If the text is scrolled vertically, dy carries the amount of pixels the
    //viewport was scrolled.
    //该信号的作用是在纯文本编辑子类中支持额外的控件,例如显示行号、断点或其他额外信息。

protected:
    virtual bool    focusNextPrevChild(bool next) override;

    virtual bool                 event(QEvent            *e) override;
    virtual void            timerEvent(QTimerEvent       *e) override;
    virtual void         keyPressEvent(QKeyEvent         *e) override;
    virtual void       keyReleaseEvent(QKeyEvent         *e) override;
    virtual void           resizeEvent(QResizeEvent      *e) override;
    virtual void            paintEvent(QPaintEvent       *e) override;
    virtual void       mousePressEvent(QMouseEvent       *e) override;
    virtual void        mouseMoveEvent(QMouseEvent       *e) override;
    virtual void     mouseReleaseEvent(QMouseEvent       *e) override;
    virtual void mouseDoubleClickEvent(QMouseEvent       *e) override;
    virtual void      contextMenuEvent(QContextMenuEvent *e) override;
    virtual void        dragEnterEvent(QDragEnterEvent   *e) override;
    virtual void        dragLeaveEvent(QDragLeaveEvent   *e) override;
    virtual void         dragMoveEvent(QDragMoveEvent    *e) override;
    virtual void             dropEvent(QDropEvent        *e) override;
    virtual void          focusInEvent(QFocusEvent       *e) override;
    virtual void         focusOutEvent(QFocusEvent       *e) override;
    virtual void             showEvent(QShowEvent        * ) override;
    virtual void           changeEvent(QEvent            *e) override;
    virtual void            wheelEvent(QWheelEvent       *e) override;
    virtual void      inputMethodEvent(QInputMethodEvent * ) override;

    //此函数返回一个新的MIME数据对象,用于表示文本编辑器当前选择的内容。
    //当需要将选择封装到新的QMimeData对象中时调用此函数,
    //例如,当开始拖放操作或将数据复制到剪贴板中时。
    //如果你重新实现这个函数,请注意,返回的 QMimeData 对象的拥有权被传递给了调用者。
    //可以使用textCursor()函数来检索选择。 // Mime 用动作(或手势)表示;比画;假唱;哑剧
    virtual QMimeData *         createMimeDataFromSelection() const;
    //如果由 source 指定的 MIME 数据对象的内容可以被解码并插入到文档中,则此函数返回 true。
    //例如,当鼠标在拖放操作期间进入此小部件并且需要确定是否可以接受拖放时,会调用此函数。
    virtual      bool    canInsertFromMimeData(const QMimeData * source) const;
    virtual      void       insertFromMimeData(const QMimeData * source);
    //此函数将 source指定的MIME数据对象的内容插入到当前光标位置的文本编辑器中。
    //每当通过剪贴板粘贴操作插入文本,或者当文本编辑器接受拖放操作的数据时,都会调用此函数。

    //Reimplements: QAbstractScrollArea::scrollContentsBy(int dx, int dy).
    virtual void scrollContentsBy(int dx, int dy) override; //卷动屏幕

    virtual void doSetTextCursor(const QTextCursor & cursor); //无注释

    //Returns the first visible block.
    QTextBlock firstVisibleBlock() const; //class QTextBlock {...};

    //Returns the bounding rectangle of the text block in the block's own coordinates.
    QRectF blockBoundingRect    (const QTextBlock & block) const;
    QRectF blockBoundingGeometry(const QTextBlock & block) const;
    //Returns the bounding rectangle of the text block in content coordinates.
    //Translate the rectangle with the contentOffset() to get
    //  visual coordinates on the viewport.

    QPointF contentOffset() const;
    //返回内容在视口坐标的原始位置。纯文本编辑内容的起始位置始终为第一个可见文本块的左上角。
    //当文本水平滚动时或当第一个可见块已部分滚动出屏幕时,内容偏移与(0.0)不同,
    //即可见文本不以第一个可见块的第一行开始,或者当第一个可见块是第一个块且编辑器显示边距时。

    QAbstractTextDocumentLayout::PaintContext getPaintContext() const;
    //Returns the paint context for the viewport(),
    //  useful only when reimplementing paintEvent().


}; //完结 class QPlainTextEdit : public QAbstractScrollArea
//关于省略的类,都预留篇幅,留待以后去完善,估计有好几个类呢,
//然后开始窗体菜单工具栏的学习 .......
//QTextCursor

class QPlainTextDocumentLayoutPrivate;
class Q_WIDGETS_EXPORT QPlainTextDocumentLayout : public QAbstractTextDocumentLayout
{
    Q_OBJECT
    Q_DECLARE_PRIVATE(QPlainTextDocumentLayout)
    Q_PROPERTY(int cursorWidth READ cursorWidth WRITE setCursorWidth)

public:
    QPlainTextDocumentLayout(QTextDocument *document);
    ~QPlainTextDocumentLayout();

    void draw(QPainter *, const PaintContext &) override;
    int hitTest(const QPointF &, Qt::HitTestAccuracy ) const override;

    int pageCount() const override;
    QSizeF documentSize() const override;

    QRectF frameBoundingRect(QTextFrame *) const override;
    QRectF blockBoundingRect(const QTextBlock &block) const override;

    void ensureBlockLayout(const QTextBlock &block) const;

    void setCursorWidth(int width);
    int cursorWidth() const;

    void requestUpdate();

protected:
    void documentChanged(int from, int /*charsRemoved*/, int charsAdded) override;


private:
    void setTextWidth(qreal newWidth);
    qreal textWidth() const;
    void layoutBlock(const QTextBlock &block);
    qreal blockWidth(const QTextBlock &block);

    QPlainTextDocumentLayoutPrivate *priv() const;

    friend class QPlainTextEdit;
    friend class QPlainTextEditPrivate;
};

QT_END_NAMESPACE

#endif // QPLAINTEXTEDIT_H

(12)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值