文章目录
QLineEdit的使用方法总结
QLineEdit 属于Qt中的基本控件(basic),但在实际使用过程中,配合其他的Qt类后实现的功能还是很丰富的。其复杂程度不下于一个复杂控件,但没有成系统性的资料可供查阅,才特意总结一下,以备后用
一、PlaceholderText
占位符文本:
- 只要行编辑为空, 行编辑则显示灰色的占位符文本
- 左对齐时,空行编辑显示占位符文本,即使它有焦点。
- 水平居中,当行编辑具有焦点时,占位符文本不会显示在光标下。
无焦点,一切正常 | 居中,有焦点,占位文本消失 | 左对齐,有焦点,占位文本显示 |
---|---|---|
![]() | ![]() | ![]() |
lineEdit->setPlaceholderText("PlaceholderText1");
lineEdit->setAlignment (Qt::AlignCenter);
lineEdit2->setPlaceholderText("PlaceholderText2");
二、clearButton
可以让行编辑在包含一些文本时显示一个尾随清除按钮
lineEdit->setClearButtonEnabled (true);
三、QAction
QLineEdit 可以添加QAction ,提供额外的选择项,另外 QAction 还能够使用 setMenu方法 添加二级菜单
- addAction(QAction *action, QLineEdit::ActionPosition position) -> void
- addAction(const QIcon &icon, QLineEdit::ActionPosition position) -> QAction *
1. 使用默认的方式显示action的菜单
菜单的显示似乎是一个 DelayedPopup 的模式,按下并保持住,菜单才会跳出来
// 获取 style 对象
auto style = this->style ();
// 用qt的图片 构建QAction对象
QAction *a= new QAction(
style->standardIcon (QStyle::SP_TitleBarMinButton),
"test1",this);
// lineEdit 在尾部添加 action
lineEdit->addAction (a,QLineEdit::TrailingPosition);
// lineEdit 在头部添加具有菜单的 action
auto menua = lineEdit->addAction (
style->standardIcon (QStyle::SP_DesktopIcon),
QLineEdit::LeadingPosition);
// 构造菜单
QMenu * menu = new QMenu(this);
// action 设置菜单
menua->setMenu (menu);
// 菜单添加菜单项
menu->addAction (style->standardIcon (QStyle::SP_TitleBarCloseButton),"test1");
menu->addAction (style->standardIcon (QStyle::SP_TitleBarMinButton), "test2");
2. QToolButton作为QAction使用
直接添加Action会有一个延时,然后才会显示菜单,这个不太符合人的感知,为了实现能点击后,就能瞬时弹出菜单,就只有使用QToolButton了,从Widget转到Action需要一个适配器一样的东西,来转换接口: QWidgetAction
QWidgetAction类通过一个接口扩展了QAction,用于将自定义小部件插入到基于操作的容器中,例如工具栏,工具按钮等。
// 获取 style 对象
auto style = this->style ();
// 用qt的图片 构建QAction对象
QAction *a= new QAction(
style->standardIcon (QStyle::SP_TitleBarMinButton),
"test1",this);
// lineEdit 在尾部添加 action
lineEdit->addAction (a,QLineEdit::TrailingPosition);
// lineEdit 在头部添加具有菜单的 widgetAction
auto action = new QAction (
style->standardIcon (QStyle::SP_DesktopIcon),
"test2",this);
QToolButton *toolButton = new QToolButton(this);
// toolButton 可以直接使用action
toolButton->setDefaultAction (action);
// 使用QWidgetAction 作为适配器转换类型
QWidgetAction * widgetAction = new QWidgetAction(this);
// 适配器直接设置 toolButton
widgetAction->setDefaultWidget (toolButton);
// lineEdit 在头部添加 widgetAction
lineEdit->addAction (widgetAction,QLineEdit::LeadingPosition);
// 构造菜单
QMenu * menu = new QMenu(this);
// toolButton 设置菜单
toolButton->setMenu (menu);
// toolButton 设置弹出模式 : 立即弹出
toolButton->setPopupMode (QToolButton::InstantPopup);
// 菜单添加菜单项
auto menuItem1 = menu->addAction ("test1");
auto menuItem2 = menu->addAction ("test2");
menu->addSeparator ();
auto menuItem3 = menu->addAction ("test3");
// 菜单项设置可选中
menuItem1->setCheckable (true);
menuItem2->setCheckable (true);
menuItem3->setCheckable (true);
// 菜单项1 默认选中
menuItem1->setChecked (true);
// 菜单项加入 QActionGroup 中,可实现互斥
auto localQActionGroup = new QActionGroup(this);
menuItem1->setActionGroup (localQActionGroup);
menuItem2->setActionGroup (localQActionGroup);
2.1 去掉 ToolButton 的菜单的下拉按钮
使用QSS 设置就行
toolButton->setStyleSheet (R"(
QToolButton::menu-indicator{image:0}
)");
四、QCompleter
设置自动补全器
QStringList wordList;
wordList << "alpha" << "Omega" << "omicron" << "zeta";
QCompleter *completer = new QCompleter(wordList, this);
completer->setCaseSensitivity(Qt::CaseInsensitive);
completer->setCompletionMode (QCompleter::UnfilteredPopupCompletion);
lineEdit->setCompleter(completer);
五、inputMask
使用输入掩码控制数据输入格式
常用格式:
Mask | Notes |
---|---|
000.000.000.000;_ | IP地址;空格是_ |
HH:HH:HH:HH:HH:HH;_ | MAC地址 |
0000-00-00 | ISO日期;空格是space |
>AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;# | 序列号;空格为#,所有(字母)字符都转换为大写。 |
#999 | 任何正数或负数,不超过四个字符,不带千位分隔符或小数位。-20,9999 |
>A<aaaaaaaaaa | 名字或姓氏中的第一个字母自动大写 |
IS\B\N 9-nnnnnn-9 | 书号,其中包含文本、第一位和最后一位(这两位都是强制的)、第一位和最后一位之间字母和字符的任何组合。 |
六、QValidator
QIntValidator, QDoubleValidator, QRegExpValidator
lineEdit->setText (QString::number (320));
auto validator = new QDoubleValidator(10, 3000, 2);
lineEdit->setValidator(validator); //设置验证器
validator->setNotation(QDoubleValidator::StandardNotation);
connect (lineEdit,&QLineEdit::textChanged ,this,[=]{
auto text = lineEdit->text ();
auto pos = text.length ();
auto state = validator->validate (text,pos);
qout << text << state;
if( state != QValidator::Acceptable ) {
if(text.toDouble () >= validator->top ()){
lineEdit->backspace ();
}
QString content = QString("范围应该是%1-%2")
.arg (validator->bottom ())
.arg (validator->top ());
QToolTip::showText(
lineEdit->mapToGlobal(QPoint(lineEdit->width (),0)),
content);
ui->lineEdit->setStyleSheet("QLineEdit{border:1px solid red}"); //改变外观样式提示错误
}
if(state == QValidator::Acceptable)
{
lineEdit->setStyleSheet("QLineEdit{border:1px solid gray border-radius: 1px }");
}
});
七、EchoMode
Constant | Value | Description |
---|---|---|
Normal | 0 | 输入字符时显示字符。这是默认设置。 |
NoEcho | 1 | 不显示任何内容。这可能适用于即使密码长度也应保密的密码。 |
Password | 2 | 显示与平台相关的密码掩码字符,而不是实际输入的字符。 |
PasswordEchoOnEdit | 3 | 在编辑时按输入的字符显示字符,编辑完成按密码显示字符。 |
打印结果:
connect (btn,&QAbstractButton::clicked,this,[this]{
qout << ui->lineEdit_1->text () << ui->lineEdit_1->displayText (); // "1234" "1234"
qout << ui->lineEdit_2->text () << ui->lineEdit_2->displayText (); // "1234" ""
qout << ui->lineEdit_3->text () << ui->lineEdit_3->displayText (); // "1234" "●●●●"
qout << ui->lineEdit_4->text () << ui->lineEdit_4->displayText (); // "1234" "●●●●" or "1234"
});
八、备忘
相关的类和方法
1. Action
-
setDefaultAction
- QMenu
- QToolButton
-
addAction
-
QLineEdit
-
QMenu
-
QMenuBar
-
QToolBar
-
QGraphicsWidget
-
QWidget - QList<QAction *>
-
QActionGroup
-
2. QCompleter
- setCompleter
- QLineEdit
- QComboBox
3. QValidator
- QLineEdit
- QSpinBox
- QComboBox
4. 正则表达式
// 获取尺寸数据的正则
QString text = "32 & 64";
static const QRegularExpression regExp(tr("(\\d+)\\s*[*&xX]\\s*(\\d+)"));
Q_ASSERT(regExp.isValid());
qout << regExp.isValid (); // true
const QRegularExpressionMatch match = regExp.match(text);
// true 2 ("32 & 64", "32", "64")
qout << match.hasMatch () << match.lastCapturedIndex ()<< match.capturedTexts ();