ElaLineEdit 组件文档
概述
ElaLineEdit 是一个现代化的单行文本输入组件,继承自 QLineEdit。它提供了动画效果、主题适配、右键菜单等增强特性。
特性
- 焦点动画
- 主题适配
- 自定义样式
- 右键菜单
- 清除按钮
- 圆角边框
- 底部指示线
- 文本间距控制
属性
基础属性
cpp
// 边框圆角
Q_PROPERTY(int borderRadius READ getBorderRadius
WRITE setBorderRadius)
// 清除按钮启用
Q_PROPERTY(bool isClearButtonEnable
READ getIsClearButtonEnable
WRITE setIsClearButtonEnable)信号
cpp
// 获得焦点
void focusIn(QString text);
// 失去焦点
void focusOut(QString text);
// 窗口失去焦点
void wmFocusOut(QString text);默认值
- 边框圆角: 6px
- 文本间距: 0.5px
- 清除按钮: 启用
- 菜单项高度: 27px
- 焦点策略: StrongFocus
- 左内边距: 10px
使用示例
基础用法
1. 创建输入框
cpp
// 创建输入框
ElaLineEdit* lineEdit = new ElaLineEdit(this);
// 设置占位符文本
lineEdit->setPlaceholderText("请输入...");
// 设置初始文本
lineEdit->setText("Hello World");
// 连接信号
connect(lineEdit, &ElaLineEdit::focusOut,
this, &MyWidget::onTextChanged);2. 自定义样式
cpp
// 设置圆角
lineEdit->setBorderRadius(8);
// 控制清除按钮
lineEdit->setIsClearButtonEnable(true);
// 设置只读
lineEdit->setReadOnly(true);
// 设置最大长度
lineEdit->setMaxLength(100);高级用法
1. 焦点处理
cpp
// 焦点获得
connect(lineEdit, &ElaLineEdit::focusIn,
this, [](const QString& text) {
qDebug() << "Focus in:" << text;
});
// 焦点失去
connect(lineEdit, &ElaLineEdit::focusOut,
this, [](const QString& text) {
qDebug() << "Focus out:" << text;
});
// 窗口焦点
connect(lineEdit, &ElaLineEdit::wmFocusOut,
this, [](const QString& text) {
qDebug() << "Window focus out:" << text;
});2. 右键菜单
cpp
// 自定义右键菜单
class CustomLineEdit : public ElaLineEdit {
protected:
void contextMenuEvent(
QContextMenuEvent* event) override {
ElaMenu* menu = new ElaMenu(this);
menu->setMenuItemHeight(27);
// 添加自定义菜单项
menu->addElaIconAction(
ElaIconType::Copy,
"复制",
QKeySequence::Copy
);
menu->popup(event->globalPos());
}
};样式系统
ElaLineEditStyle
自定义代理样式类,负责绘制输入框外观。
cpp
void drawPrimitive(PrimitiveElement element,
const QStyleOption* option,
QPainter* painter,
const QWidget* widget) const override
{
// 绘制边框
painter->setBrush(borderColor);
painter->drawRoundedRect(rect, 6, 6);
// 绘制背景
painter->setBrush(backgroundColor);
painter->drawRoundedRect(innerRect, 6, 6);
// 绘制底边线
painter->setBrush(hemlineColor);
painter->drawPath(bottomPath);
}动画效果
焦点动画
cpp
QPropertyAnimation* markAnimation =
new QPropertyAnimation(d, "pExpandMarkWidth");
markAnimation->setDuration(300);
markAnimation->setEasingCurve(
QEasingCurve::InOutSine);
markAnimation->setStartValue(currentWidth);
markAnimation->setEndValue(targetWidth);注意事项
- 继承自 QLineEdit
- 自动处理主题切换
- 支持撤销/重做
- 支持剪切板操作
- 动画时长300ms
- 使用事件总线
- 注意内存管理
- 性能优化
最佳实践
- 合理设置文本长度
- 处理焦点变化
- 注意输入验证
- 控制动画效果
- 处理主题切换
- 优化用户体验
- 合理使用事件
- 保持样式一致
相关组件
- QLineEdit: 基类
- ElaMenu: 右键菜单
- ElaTheme: 主题管理
- ElaEventBus: 事件总线