QStaticText Class
当文本及其布局很少更新时,QStaticText 类可实现文本的优化绘制。更多内容...
| 标题: | #include <QStaticText> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake: | QT += gui |
- 所有成员的列表,包括继承的成员
- QStaticText 属于“隐式共享类”。
公共类型
| enum | PerformanceHint { ModerateCaching, AggressiveCaching } |
公共函数
| QStaticText() | |
| QStaticText(const QString &text) | |
| QStaticText(const QStaticText &other) | |
| ~QStaticText() | |
| QStaticText::PerformanceHint | performanceHint() const |
| void | prepare(const QTransform &matrix = QTransform(), const QFont &font = QFont()) |
| void | setPerformanceHint(QStaticText::PerformanceHint performanceHint) |
| void | setText(const QString &text) |
| void | setTextFormat(Qt::TextFormat textFormat) |
| void | setTextOption(const QTextOption &textOption) |
| void | setTextWidth(qreal textWidth) |
| QSizeF | size() const |
| void | swap(QStaticText &other) |
| QString | text() const |
| Qt::TextFormat | textFormat() const |
| QTextOption | textOption() const |
| qreal | textWidth() const |
| bool | operator!=(const QStaticText &other) const |
| QStaticText & | operator=(const QStaticText &other) |
| bool | operator==(const QStaticText &other) const |
详细说明
QStaticText 提供了一种缓存文本块布局数据的方法,使其绘制效率高于使用 `QPainter::drawText()`——后者会在每次调用时重新计算布局信息。
该类主要针对以下情况提供优化:在多个绘制事件中,文本、其字体以及绘制器上的变换保持静态不变。如果文本或其布局在每次迭代中都会发生变化,则QPainter::drawText() 是更高效的替代方案,因为静态文本的布局必须重新计算以考虑新状态。
平移绘图器不会导致文本布局被重新计算,但会对 drawStaticText() 造成极小的性能影响。修改绘图器变换的任何其他部分或绘图器的字体,都会导致静态文本的布局被重新计算。 应尽可能避免这种情况,以最大限度地发挥使用 QStaticText 的性能优势。
此外,drawStaticText() 仅支持仿射变换。在投影画笔上调用 drawStaticText() 的性能会略逊于使用常规的 drawText() 调用,因此应避免这样做。
class MyWidget: public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent), m_staticText("This is static text")
protected:
void paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawStaticText(0, 0, m_staticText);
}
private:
QStaticText m_staticText;
};QStaticText 类可用于模拟QPainter::drawText() 在无边界情况下的行为,以及在调用QPainter::drawText() 并指定边界矩形时的行为。
如果不需要边界矩形,请在创建 QStaticText 对象时不要设置首选文本宽度。这样,文本将仅占一行。
如果在 QStaticText 对象上设置了文本宽度,这将限制文本的显示范围。 文本将被格式化,以确保没有一行超过给定的宽度。为 QStaticText 设置的文本宽度不会自动用于裁剪。若要在换行之外实现裁剪,请使用QPainter::setClipRect()。文本的位置由传递给QPainter::drawStaticText() 的参数决定,且每次调用时位置均可改变,对性能的影响微乎其微。
为了更加方便,可以使用QTextDocument 支持的HTML子集对文本进行格式化。QStaticText将尝试通过Qt::mightBeRichText()推断输入文本的格式,如果该函数返回true ,则将其解释为富文本。 若要强制 QStaticText 将内容显示为纯文本或富文本,请使用函数QStaticText::setTextFormat(),并分别传入Qt::PlainText 和Qt::RichText 。
由于 QStaticText 只能表示文本,因此只有那些改变文本布局或外观的 HTML 标签才会被支持。例如,在输入的 HTML 中添加图片会导致该图片被纳入布局,从而影响文本字形的的位置,但该图片本身不会被显示。 结果是在输出中会出现一个与图片大小相同的空白区域。同样地,使用表格会导致文本以表格格式排版,但边框不会被绘制出来。
如果这是首次绘制静态文本,或者自上次绘制以来静态文本或绘图器的字体发生了变化,则必须重新计算文本的布局。在某些绘图引擎中,更改绘图器的矩阵也会导致布局被重新计算。 具体而言,除 OpenGL2 绘制引擎外,其他所有引擎都会发生这种情况。重新计算布局会在调用QPainter::drawStaticText() 的位置产生额外开销。为避免在绘制事件中出现此开销,您可以提前调用prepare() 以确保布局已计算完成。
另请参阅 QPainter::drawText()、QPainter::drawStaticText()、QTextLayout 以及QTextDocument 。
成员类型文档
enum QStaticText::PerformanceHint
此枚举列出了可在QStaticText 上设置的各种性能提示。这些提示可用于指示QStaticText 在可能的情况下使用额外的缓存,以牺牲内存为代价来提升性能。特别是,在QStaticText 上设置AggressiveCaching性能提示,将在使用OpenGL图形系统或向QOpenGLWidget 绘制时提升性能。
| 常量 | 值 | 描述 |
|---|---|---|
QStaticText::ModerateCaching | 0 | 以较低的内存消耗进行基本缓存,从而获得高性能。 |
QStaticText::AggressiveCaching | 1 | 在可用时使用额外缓存。这可能会以更高的内存消耗为代价来提高性能。 |
成员函数文档
QStaticText::QStaticText()
创建一个空的 QStaticText
[explicit] QStaticText::QStaticText(const QString &text)
使用给定的text 创建一个QStaticText对象。
QStaticText::QStaticText(const QStaticText &other)
创建一个 QStaticText 对象,该对象是other 的副本。
[noexcept] QStaticText::~QStaticText()
销毁QStaticText 。
QStaticText::PerformanceHint QStaticText::performanceHint() const
返回为QStaticText 设置了哪条性能提示。
另请参阅 setPerformanceHint()。
void QStaticText::prepare(const QTransform &matrix = QTransform(), const QFont &font = QFont())
为QStaticText 对象做好绘制准备,使其能够使用给定的matrix 和font 进行绘制,从而在实际调用drawStaticText()时避免额外开销。
当调用 drawStaticText() 时,如果QStaticText 对象的任何部分自上次绘制以来发生了变化,则会重新计算QStaticText 的布局。 如果绘制器的字体与上次绘制QStaticText 时不同,或者在OpenGL2引擎以外的任何其他绘制引擎中,如果绘制器的矩阵自上次绘制静态文本以来发生了改变,布局也会被重新计算。
为了避免在修改后首次绘制QStaticText 时创建布局带来的开销,您可以使用prepare()函数,并传入绘制文本时预计要使用的matrix 和font 。
另请参阅 QPainter::setFont() 和QPainter::setWorldTransform()。
void QStaticText::setPerformanceHint(QStaticText::PerformanceHint performanceHint)
根据提供的performanceHint 设置QStaticText 的性能提示。performanceHint 用于自定义内部缓存的程度,以提升性能。
默认值为QStaticText::ModerateCaching 。
注意:此 函数会导致文本的排版需要重新计算。
另请参阅 performanceHint()。
void QStaticText::setText(const QString &text)
将QStaticText 的文本设置为text 。
注意:此 函数会导致文本的布局需要重新计算。
另请参阅 text()。
void QStaticText::setTextFormat(Qt::TextFormat textFormat)
将QStaticText 的文本格式设置为textFormat 。如果textFormat 设置为Qt::AutoText (默认值),则将尝试使用Qt::mightBeRichText()函数来确定文本的格式。 如果文本格式为Qt::PlainText ,则文本将按原样显示;而如果格式为Qt::RichText ,则文本将被解释为 HTML。QStaticText 支持用于更改文本字体、颜色或布局的 HTML 标签。
注意:此 函数会导致文本的布局需要重新计算。
另请参阅 textFormat()、setText() 和text()。
void QStaticText::setTextOption(const QTextOption &textOption)
将控制排版过程的文本选项结构设置为给定的textOption 。
另请参阅 textOption()。
void QStaticText::setTextWidth(qreal textWidth)
设置此QStaticText 的首选宽度。如果文本宽度超过指定宽度,它将被拆分为多行并沿垂直方向扩展。如果文本无法拆分为多行,其高度将超过指定的textWidth 。
将首选文本宽度设置为负数会导致文本无边界。
使用size() 可获取文本的实际大小。
注意:此 函数会导致文本的布局需要重新计算。
QSizeF QStaticText::size() const
返回此QStaticText 的边界矩形大小。
另请参阅 textWidth()。
[noexcept] void QStaticText::swap(QStaticText &other)
将此静态文本实例替换为other 。此操作速度极快,且绝不会失败。
QString QStaticText::text() const
返回QStaticText 的文本内容。
另请参阅 setText()。
Qt::TextFormat QStaticText::textFormat() const
返回QStaticText 的文本格式。
另请参阅 setTextFormat()、setText() 和text()。
QTextOption QStaticText::textOption() const
返回当前用于控制布局过程的文本选项。
另请参阅 ` setTextOption()`。
qreal QStaticText::textWidth() const
返回此QStaticText 的首选宽度。
另请参阅 setTextWidth()。
bool QStaticText::operator!=(const QStaticText &other) const
将other 与QStaticText 进行比较。如果文本、字体或最大尺寸存在差异,则返回true 。
QStaticText &QStaticText::operator=(const QStaticText &other)
将other 分配给此QStaticText 。
bool QStaticText::operator==(const QStaticText &other) const
将other 与QStaticText 进行比较。如果文本内容、字体和文本宽度均相等,则返回true 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.