当前位置: 首页 > news >正文

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_NAMESPACEclass 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_OBJECTQ_DECLARE_PRIVATE(QPlainTextEdit)//此属性获取和设置纯文本编辑器的内容。当设置此属性时,会删除之前的内容并重置撤销/重做历史。//currentCharFormat()也会被重置,除非textCursor()已经在文档的开头。//默认情况下,对于没有内容的编辑器,此属性包含空字符串。Q_PROPERTY(QString    plainText     //代表文本框里的全部内容READ    toPlainText   WRITE  setPlainTextNOTIFY         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       maximumBlockCountREAD     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     tabStopDistanceREAD     tabStopDistance   WRITE   setTabStopDistance)//此属性存储以像素为单位的制表符停止距离。  默认情况下,此属性包含80像素的值。 // 80 pixels//不要设置小于QChar::VisualTabCharacter字符的horizontalAdvance()的值,否则制表符将绘制不完全。//此属性表示是否启用了撤销和重做。 默认情况下,此属性为true。//只有当此属性为真,并且存在可以撤销(或重做)的操作时,用户才能撤销或重做操作。Q_PROPERTY(bool      undoRedoEnabledREAD   isUndoRedoEnabled   WRITE   setUndoRedoEnabled)//enum QPlainTextEdit::LineWrapMode { NoWrap, WidgetWidth };就定义在本类里//此属性保存行换行模式。 默认模式是WidgetWidth,它使单词在文本编辑器的右侧边缘进行换行。//换行发生在空格处保持整个单词完整。如果您想在单词内进行换行,请使用setWordWrapMode()函数。Q_PROPERTY(LineWrapMode   lineWrapModeREAD          lineWrapMode  WRITE  setLineWrapMode)//enum QTextOption::WrapMode { NoWrap, WordWrap, ManualWrap, WrapAnywhere,//                                        WrapAtWordBoundaryOrAnywhere     };QDOC_PROPERTY(QTextOption::WrapMode   wordWrapModeREAD                      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=TextEditorInteractionQ_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
//关于省略的类,都预留篇幅,留待以后去完善,估计有好几个类呢,
//然后开始窗体菜单工具栏的学习 .......
//QTextCursorclass QPlainTextDocumentLayoutPrivate;
class Q_WIDGETS_EXPORT QPlainTextDocumentLayout : public QAbstractTextDocumentLayout
{Q_OBJECTQ_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)

谢谢

相关文章:

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

&#xff08;10&#xff09;关于文本处理的内容很多&#xff0c;来不及全面阅读、思考与整理。先给出类的继承图&#xff1a; &#xff08;11&#xff09;本源代码来自于头文件 qplaintextedit . h &#xff1a; #ifndef QPLAINTEXTEDIT_H #define QPLAINTEXTEDIT_H#include &…...

yocto5.2开发任务手册-7 升级配方

此文为机器辅助翻译&#xff0c;仅供个人学习使用&#xff0c;如有翻译不当之处欢迎指正 7 升级配方 随着时间的推移&#xff0c;上游开发者会为图层配方构建的软件发布新版本。建议使配方保持与上游版本发布同步更新。 虽然有多种升级配方的方法&#xff0c;但您可能需要先…...

LangPDF: Empowering Your PDFs with Intelligent Language Processing

LangPDF: Empowering Your PDFs with Intelligent Language Processing Unlock Global Communication: AI-Powered PDF Translation and Beyond In an interconnected world, seamless multilingual document management is not just an advantage—it’s a necessity. LangP…...

DDS(数据分发服务) 和 P2P(点对点网络) 的详细对比

1. 核心特性对比 维度 DDS P2P 实时性 微秒级延迟&#xff0c;支持硬实时&#xff08;如自动驾驶&#xff09; 毫秒至秒级&#xff0c;依赖网络环境&#xff08;如文件传输&#xff09; 架构 去中心化发布/订阅模型&#xff0c;节点自主发现 完全去中心化&#xff0c;节…...

TC8:SOMEIP_ETS_029-030

SOMEIP_ETS_029: echoUINT8Array16Bitlength 目的 检查当method echoUINT8Array16BitLength的参数中长度字段为16bit时,SOME/IP协议层是否能对参数进行序列化和反序列化。 对于可变长度的数组而言,必须用长度字段表示数组长度。否则接收方无法判断有效数据。 SOMEIP_ETS_02…...

Elasticsearch索引全生命周期管理指南之一

#作者&#xff1a;猎人 文章目录 一、索引常规操作二、索引mapping和别名管理 一、索引常规操作 索引数据特点&#xff1a; 索引中的数据随着时间&#xff0c;持续不断增长 按照时间序列划分索引的好处&挑战&#xff1a; 按照时间进行划分索引&#xff0c;会使得管理更加…...

本土DevOps革命:Gitee如何撬动中国企业的数字化转型新动能

在数字化浪潮席卷全球的背景下&#xff0c;中国企业正面临前所未有的转型压力与机遇。随着《数据安全法》和《个人信息保护法》的全面实施&#xff0c;以及信创产业政策的深入推进&#xff0c;研发工具链的自主可控已成为关乎企业核心竞争力的战略命题。在这一关键赛道上&#…...

ARM服务器解决方案

ARM服务器解决方案已成为异构计算领域的重要技术路径&#xff0c;其核心优势与多元化场景适配性正加速产业渗透。以下为关键要点分析&#xff1a; 一、核心优势与架构设计 能效比优化‌ ARM架构基于RISC指令集&#xff0c;单节点功耗可控制在15W以下&#xff0c;较x86架构能效…...

【暗光图像增强】【基于CNN的方法】2020-AAAI-EEMEFN

EEMEFN&#xff1a;Low-Light Image Enhancement via Edge-Enhanced Multi-Exposure Fusion Network EEMEFN&#xff1a;基于边缘增强多重曝光融合网络的低光照图像增强 AAAI 2020 论文链接 0.论文摘要 本研究专注于极低光照条件下的图像增强技术&#xff0c;旨在提升图像亮度…...

嵌入式EasyRTC音视频实时通话SDK在工业制造领域的智能巡检/AR协作等应用

一、背景 在数字化浪潮席卷全球的当下&#xff0c;远程监控与驾驶技术已深度渗透至工业巡检、智能交通等核心领域。然而&#xff0c;传统方案普遍面临实时性瓶颈、高延迟传输及交互体验匮乏等痛点&#xff0c;严重制约行业智能化转型。EasyRTC作为前沿的实时音视频通信技术&am…...

uniapp-商城-58-后台 新增商品(属性子级的添加和更新)

前面对父级属性的添加进行了分析&#xff0c;这里再来继续做属性子级的数据添加&#xff0c;包含页面逻辑以及后台处理的逻辑。当然这里还是在前面的云对象的方式进行的。 本文介绍了在云对象green-mall-sku中添加子级属性的实现过程。首先&#xff0c;通过updateChild接口处理…...

基于springboot+vue的机场乘客服务系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 用户管理 航班信…...

npm和nvm和nrm有什么区别

npm 全称&#xff1a;Node Package Manager。 作用&#xff1a; 包管理&#xff1a;用于安装、共享、分发代码&#xff0c;管理项目依赖关系。项目管理&#xff1a;创建和管理 package.json 文件&#xff0c;记录项目依赖和配置信息。脚本执行&#xff1a;运行项目中的脚本&…...

几种排序方式的C语言实现(冒泡、选择、插入、希尔等)

## 分类 存储器类型&#xff1a; - 内排序&#xff08;数据规模小 内存&#xff09; - 外排序&#xff08;数据库 磁盘&#xff09; 是否基于元素之间的比较 - 基数排序 - 其他排序&#xff1a;冒泡、选择、插入、快速、归并、希尔、堆…… 时间复杂度 - O&#…...

【MATLAB例程】线性卡尔曼滤波的程序,三维状态量和观测量,较为简单,可用于理解多维KF,附代码下载链接

本文所述代码实现了一个 三维状态的扩展卡尔曼滤波 (Extended Kalman Filter, EKF) 算法。通过生成过程噪声和观测噪声&#xff0c;对真实状态进行滤波估计&#xff0c;同时对比了滤波前后状态量的误差和误差累积分布曲线。 文章目录 简介运行结果MATLAB源代码 简介 代码分为以…...

芯片测试之X-ray测试

原理&#xff1a; X-ray是利用阴极射线管产生高能量电子与金属靶撞击&#xff0c;在撞击过程中&#xff0c;因电子突然减速&#xff0c;其损失的动能会以X-Ray形式放出。而对于样品无法以外观方式观测的位置&#xff0c;利用X-Ray穿透不同密度物质后其光强度的变化&#xff0c;…...

机器学习中的特征工程:解锁模型性能的关键

在机器学习领域&#xff0c;模型的性能往往取决于数据的质量和特征的有效性。尽管深度学习模型在某些任务中能够自动提取特征&#xff0c;但在大多数传统机器学习任务中&#xff0c;特征工程仍然是提升模型性能的关键环节。本文将深入探讨特征工程的重要性、常用方法以及在实际…...

【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(1)

机器学习&#xff08;Machine Learning&#xff09; 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习&#xff08;Machine Learning&#xff09;简要声明 机器学习之深度学习神经网络入门一、神经网络的起源与发展二、神经元模型&#xff08;…...

反向传播算法:神经网络的核心优化方法,一文打通任督二脉

搞神经网络训练,**反向传播(Backpropagation)**是最核心的算法。 没有它,模型就只能瞎猜参数,训练基本白搭。 这篇文章不整公式推导,不搞花架子,咱就把最关键的几个问题讲明白: 反向传播到底是干啥的? 它是怎么一步步更新参数的? 哪些坑你必须避免? 一、反向传播是…...

neo4j框架:java安装教程

安装使用neo4j需要事先安装好java&#xff0c;java版本的选择是一个犯难的问题。本文总结了在安装java和使用Java过程中遇到的问题以及相应的解决方法。 Java的安装包可以在java官方网站Java Downloads | Oracle 中国进行下载 以java 8为例&#xff0c;选择最后一行的x64 compr…...

基于React的高德地图api教程007:椭圆的绘制、编辑和删除

文章目录 7、椭圆绘制7.1 绘制椭圆7.1.1 设置圆心7.1.2 确定短半轴7.1.3 确定长半轴7.1.4 实时显示椭圆形状7.2 修改椭圆7.2.1 修改椭圆属性信息7.2.2 修改椭圆形状7.3 删除椭圆7.4 定位椭圆7.5 代码下载7.07、椭圆绘制 7.1 绘制椭圆 7.1.1 设置圆心 第一次点击地图设置圆心…...

Python多线程实战:提升并发效率的秘诀

一、前言&#xff1a;为什么需要多任务处理&#xff1f; 在实际开发中&#xff0c;我们经常需要让程序同时执行多个任务&#xff0c;例如&#xff1a; 同时下载多个文件&#xff1b;在后台运行耗时计算的同时保持界面响应&#xff1b;并发处理网络请求等。 Python 提供了多种…...

将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector

作者&#xff1a; Andre Luiz 讨论如何以及何时使用 semantic_text、dense_vector 或 sparse_vector&#xff0c;以及它们与嵌入生成的关系。 通过这个自定进度的 Search AI 实践学习亲自体验向量搜索。你可以开始免费云试用&#xff0c;或者在本地机器上尝试 Elastic。 多年来…...

RabbitMQ 消息模式实战:从简单队列到复杂路由(四)

模式对比与选择 各模式特点对比 简单队列模式&#xff1a;结构最为简单&#xff0c;生产者直接将消息发送到队列&#xff0c;消费者从队列中获取消息&#xff0c;实现一对一的消息传递。其优势在于易于理解和实现&#xff0c;代码编写简单&#xff0c;适用于初学者和简单业务…...

OpenCV CUDA模块中矩阵操作------归一化与变换操作

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 OpenCV 的 CUDA 模块中&#xff0c;normalize 和 rectStdDev 函数用于对矩阵进行归一化处理和基于积分图计算矩形区域的标准差。 函数介绍 …...

1Panel应用推荐:Beszel轻量级服务器监控平台

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…...

谷歌地图代理 | 使用 HTML 和矢量模式 API 更轻松地创建 Web 地图

在过去的一年里&#xff0c;谷歌对 Maps JavaScript API 进行了两项重要更新&#xff0c;以便更轻松地采用我们最新、最好的地图&#xff1a;HTML 地图和矢量模式 API。今天谷歌地图亚太区最大代理商之一的 Cloud Ace云一 为大家介绍一下更新的具体内容。 联系我们 - Cloud Ac…...

最新开源 TEN VAD 与 Turn Detection 让 Voice Agent 对话更拟人 | 社区来稿

关键词&#xff1a;对话式 AI | 语音智能体 | Voice Agent | VAD | 轮次检测 | 声网 | TEN GPT-4o 所展示对话式 AI 的新高度&#xff0c;正一步步把我们在电影《Her》中看到的 AI 语音体验变成现实。AI 的语音交互正在变得更丰富、更流畅、更易用&#xff0c;成为构建多模态智…...

「Mac畅玩AIGC与多模态40」开发篇35 - 用 Python 开发服务对接 SearxNG 与本地知识库

一、概述 本篇介绍如何使用 Python 构建一个集成本地聚合搜索引擎 SearxNG 与本地知识库的双通道服务接口&#xff0c;返回标准结构化 JSON 数据&#xff0c;并用于对接智能体插件系统。该接口适用于本地 Agent 应用开发与 Dify 插件集成场景。 二、目标说明 使用 Flask 实现…...

【Boost搜索引擎】构建Boost站内搜索引擎实践

目录 1. 搜索引擎的相关宏观原理 2. 正排索引 vs 倒排索引 - 搜索引擎具体原理 3. 编写数据去标签与数据清洗的模块 Parser 去标签 编写parser 用boost枚举文件名 解析html 提取title ​编辑 去标签 构建URL 将解析内容写入文件中 4. 编写建立索引的模块 Index 建…...

记参加一次数学建模

题目请到全国大学生数学建模竞赛下载查看。 注&#xff1a;过程更新了很多文件&#xff0c;所有这里贴上的有些内容不是最新的&#xff08;而是草稿&#xff09;。 注&#xff1a;我们队伍并没有获奖&#xff0c;文章内容仅供一乐。 从这次比赛&#xff0c;给出以下赛前建议 …...

【gRPC】HTTP/2协议,HTTP/1.x中线头阻塞问题由来,及HTTP/2中的解决方案,RPC、Protobuf、HTTP/2 的关系及核心知识点汇总

HTTP/2协议特点 gRPC基于HTTP/2协议&#xff0c;原因&#xff1a; 多路复用&#xff1a;允许在同一个TCP连接上并行传输多个请求和响应&#xff0c;即多个gRPC调用可以通过同一个连接同时进行&#xff0c;避免了HTTP/1.x中常见的线头阻塞问题&#xff0c;减少了连接建立和关闭…...

mac中加载C++动态库文件

前言 需要再mac系统下运行C开发的程序&#xff0c;通过摸索&#xff0c;初步实现了一版&#xff0c;大致记录下 1. 前提准备 安装OpenCV 使用Homebrew安装OpenCV&#xff1a; brew install opencv确认安装路径&#xff1a; brew --prefix opencv默认路径为/opt/homebrew/…...

Apollo Client 1.6.0 + @RefreshScope + @Value 刷新问题解析

问题描述 在使用 Apollo Client 1.6.0 结合 Spring Cloud 的 RefreshScope 和 Value 注解时&#xff0c;遇到以下问题&#xff1a; 项目启动时第一次属性注入成功后续配置变更时&#xff0c;Value 属性会刷新&#xff0c;但总是刷新为第一次的旧值&#xff0c;而不是最新的配…...

大语言模型 09 - 从0开始训练GPT 0.25B参数量 补充知识之数据集 Pretrain SFT RLHF

写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…...

文本分类任务Qwen3-0.6B与Bert:实验见解

文本分类任务Qwen3-0.6B与Bert&#xff1a;实验见解 前言 最近在知乎上刷到一个很有意思的提问Qwen3-0.6B这种小模型有什么实际意义和用途。查看了所有回答&#xff0c;有人提到小尺寸模型在边缘设备场景中的优势&#xff08;低延迟&#xff09;、也有人提出小模型只是为了开…...

Mysql、Oracle、Sql Server、达梦之间sql的差异

1&#xff1a;分页查询 Sql Server&#xff1a; <bind name"startRow" value"(page - 1) * limit 1"/> <bind name"endRow" value"page * limit"/> SELECT *FROM (SELECT ROW_NUMBER() OVER (<if test"sortZd!…...

STM32外设AD-DMA+定时读取模板

STM32外设AD-DMA定时读取模板 一&#xff0c;方法引入二&#xff0c;CubeMX配置三&#xff0c;变量声明四&#xff0c;代码实现 (单通道) 一&#xff0c;方法引入 轮询法虽然简单&#xff0c;但 CPU 一直在忙着等待&#xff0c;效率太低。为了让 CPU 能在 ADC 转换的同时处理其…...

SQL里where条件的顺序影响索引使用吗?

大家好&#xff0c;我是锋哥。今天分享关于【SQL里where条件的顺序影响索引使用吗&#xff1f;】面试题。希望对大家有帮助&#xff1b; SQL里where条件的顺序影响索引使用吗&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 查询中&#xff0c;W…...

Java 接口中实现异步处理的方法

在Java中,接口本身不能直接实现逻辑(接口中的方法默认是抽象的,JDK 8+允许通过default方法提供非抽象实现,但通常不用于复杂的异步处理)。异步处理的逻辑需要在实现接口的类中通过多线程、异步框架或回调机制来实现。以下是几种常见的在接口实现类中实现异步处理<...

数值分析证明题

文章目录 第一题第二题第三题第四题第五题第六题第七题第八题第九题 第一题 例 给出 cos ⁡ x \cos x cosx&#xff0c; x ∈ [ 0 ∘ , 9 0 ∘ ] x\in[0^{\circ},90^{\circ}] x∈[0∘,90∘]的函数表&#xff0c;步长 h 1 ′ ( 1 60 ) ∘ h 1 (\frac{1}{60})^{\circ} h1′…...

深入理解二叉树:遍历、存储与算法实现

在之前的博客系列中&#xff0c;我们系统地探讨了多种线性表数据结构&#xff0c;包括顺序表、栈和队列等经典结构&#xff0c;并通过代码实现了它们的核心功能。从今天开始&#xff0c;我们将开启一个全新的数据结构篇章——树结构。与之前讨论的线性结构不同&#xff0c;树形…...

Python web 开发 Flask HTTP 服务

Flask 是一个轻量级的 Web 应用框架&#xff0c;它基于 Python 编写&#xff0c;特别适合构建简单的 Web 应用和 RESTful API。Flask 的设计理念是提供尽可能少的约定和配置&#xff0c;从而让开发者能够灵活地构建自己的 Web 应用。 https://andi.cn/page/622189.html...

【AI】用Dify实现一个模拟面试的功能

前言 Dify&#xff0c;一个将LLM转换为实际工作流的工具&#xff0c;以及火了一段时间了&#xff0c;但直到最近才开始研究它的使用&#xff08;主要前段时间在忙着自己的独立开发项目&#xff09;&#xff0c;我发现它的功能基本上满足了我对大语言模型&#xff0c;从仅对话转…...

研华服务器ASMB-825主板无法识别PCIE-USB卡(笔记本)

系统下无法识别到USB卡&#xff0c;排除硬件问题&#xff0c;系统问题。 最后在BIOS中更改此PCIE端口参数为X4X4X4X4&#xff0c;设置完成后可正常使用USB卡。 底部有问题详细解析。 针对研华主板ASMB-825安装绿联PCIE-USB卡无法识别的问题&#xff0c;结合BIOS设置调整的解决过…...

Redisson 四大核心机制实现原理详解

一、可重入锁&#xff08;Reentrant Lock&#xff09; 可重入锁是什么&#xff1f; 通俗定义 可重入锁类似于一把“智能锁”&#xff0c;它能识别当前的锁持有者是否是当前线程&#xff1a; 如果是&#xff0c;则允许线程重复获取锁&#xff08;重入&#xff09;&#xff0c;并…...

云计算与大数据进阶 | 26、解锁云架构核心:深度解析可扩展数据库的5大策略与挑战(上)

在云应用/服务的 5 层架构里&#xff0c;数据库服务层稳坐第 4 把交椅&#xff0c;堪称其中的 “硬核担当”。它的复杂程度常常让人望而生畏&#xff0c;不少人都将它视为整个架构中的 “终极挑战”。 不过&#xff0c;也有人觉得可扩展存储系统才是最难啃的 “硬骨头”&#…...

Android从单体架构迁移到模块化架构。你会如何设计模块划分策略?如何处理模块间的通信和依赖关系

从单体架构迁移到模块化架构。可能有些小伙伴已经深陷单体架构的泥潭&#xff0c;代码耦合得跟一团麻线似的&#xff0c;改个小功能都能牵一发而动全身&#xff1b;也可能有些团队在协作时&#xff0c;经常因为代码冲突或者职责不清搞得焦头烂额。相信我&#xff0c;这些问题我…...

基于MATLAB的人脸识别,实现PCA降维,用PCA特征进行SVM训练

基于MATLAB的人脸识别完整流程&#xff0c;包含PCA降维和SVM分类的实现。我们以经典的ORL人脸数据库为例&#xff0c;演示从数据加载到结果评估的全过程。 1. 数据准备与预处理​ 1.1 下载数据集​ 下载ORL人脸数据库&#xff08;40人10张&#xff0c;共400张图像&#xff09…...

AI 赋能 Copula 建模:大语言模型驱动的相关性分析革新

技术点目录 R及Python语言及相关性研究初步二元Copula理论与实践&#xff08;一&#xff09;二元Copula理论与实践&#xff08;二&#xff09;【R语言为主】Copula函数的统计检验与选择【R语言为主】高维数据与Vine Copula 【R语言】正则Vine Copula&#xff08;一&#xff09;…...