TextArea - Material 多行文本框¶
TextArea 是 Material Design 3 多行文本输入框控件的完整实现,支持填充(Filled)和描边(Outlined)两种变体。包含浮动标签、字符计数器、帮助/错误文本和自动调整高度功能。
类参考¶
namespace cf::ui::widget::material;
class TextArea : public QTextEdit {
Q_OBJECT
Q_PROPERTY(TextAreaVariant variant READ variant WRITE setVariant)
Q_PROPERTY(QString label READ label WRITE setLabel)
Q_PROPERTY(QString helperText READ helperText WRITE setHelperText)
Q_PROPERTY(QString errorText READ errorText WRITE setErrorText)
Q_PROPERTY(int maxLength READ maxLength WRITE setMaxLength)
Q_PROPERTY(bool showCharacterCounter READ showCharacterCounter WRITE setShowCharacterCounter)
Q_PROPERTY(bool isFloating READ isFloating NOTIFY floatingChanged)
Q_PROPERTY(int minLines READ minLines WRITE setMinLines)
Q_PROPERTY(int maxLines READ maxLines WRITE setMaxLines)
};
头文件:ui/widget/material/widget/textarea/textarea.h
变体¶
基本用法¶
#include "widget/material/widget/textarea/textarea.h"
using namespace cf::ui::widget::material;
// 创建多行文本框
auto* textarea = new TextArea(TextFieldVariant::Outlined, this);
textarea->setLabel("Description");
textarea->setHelperText("Enter a detailed description");
// 设置可见行数范围
textarea->setMinLines(3); // 最少显示 3 行
textarea->setMaxLines(8); // 最多显示 8 行,超出后显示滚动条
// 带字符计数器
textarea->setMaxLength(500);
textarea->setShowCharacterCounter(true);
// 连接信号
connect(textarea, &QTextEdit::textChanged, this, &MyClass::onContentChanged);
自动调整高度¶
TextArea 支持根据内容自动调整高度:
// 设置最少显示行数(默认 1)
textarea->setMinLines(2);
// 设置最多显示行数(0 = 无限制)
textarea->setMaxLines(6);
// 当内容增加时,文本框会从 minLines 增长到 maxLines
// 超过 maxLines 后,内部会出现滚动条
keyPressEvent 会在达到 maxLines 限制时阻止 Enter 键产生新行。
浮动标签¶
与 TextField 相同,标签在获得焦点或有内容时浮动到文本框上方:
textarea->setLabel("Comments");
// 浮动动画由 CFMaterialAnimationFactory 驱动
// floatingProgress 从 0.0(静止)到 1.0(浮动)
帮助文本与错误文本¶
textarea->setHelperText("Maximum 500 characters");
// 错误文本优先级高于帮助文本
textarea->setErrorText("Content exceeds maximum length");
textarea->setErrorText(""); // 清除错误
与 TextField 的区别¶
| 特性 | TextField | TextArea |
|---|---|---|
| 基类 | QLineEdit |
QTextEdit |
| 输入类型 | 单行文本 | 多行文本 |
| 自动调整高度 | 不支持 | 支持(minLines/maxLines) |
| 前缀/后缀图标 | 支持 | 不支持 |
| 清除按钮 | 支持 | 不支持 |
交互状态¶
| 状态 | 视觉效果 |
|---|---|
| Normal | 默认外观 |
| Hovered | 状态层叠加 |
| Focused | 边框高亮 + 浮动标签 |
| Error | Error 颜色边框/指示线 |
| Disabled | 38% 透明度 |
绘制流程¶
TextArea 的 paintEvent 实现以下绘制步骤:
- 绘制背景(
drawBackground) - 绘制描边(
drawOutline) - 绘制帮助文本(
drawHelperText) - 绘制字符计数器(
drawCharacterCounter) - 绘制焦点指示器(
drawFocusIndicator) - 绘制水波纹(
drawRipple)
主要方法¶
| 方法 | 说明 |
|---|---|
variant() / setVariant(TextAreaVariant) |
获取/设置变体 |
label() / setLabel(const QString&) |
获取/设置标签文本 |
helperText() / setHelperText(const QString&) |
获取/设置帮助文本 |
errorText() / setErrorText(const QString&) |
获取/设置错误文本 |
isFloating() |
标签是否处于浮动状态 |
showCharacterCounter() / setShowCharacterCounter(bool) |
获取/设置字符计数器 |
maxLength() / setMaxLength(int) |
获取/设置最大长度(0=无限制) |
minLines() / setMinLines(int) |
获取/设置最少可见行数 |
maxLines() / setMaxLines(int) |
获取/设置最多可见行数(0=无限制) |
信号¶
| 信号 | 说明 |
|---|---|
floatingChanged(bool) |
标签浮动状态变化时发射 |
| 继承自 QTextEdit | textChanged 等 |