Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
导读
行文本输入框在用于界面的文本输入,在WEB登录表单中应用广泛。一般行文本编辑框可定制性较高,既可以当作密码输入框,又可以作为文本过滤器。QLineEdit本身使用方法也很简单,无需过多的设置就能进行使用。于是这篇博文主要讲解如何对行文本编辑框QLineEdit进行定制。
基本定制
为了简化工作,还是如同前面所说的,直接用Qt Designer拖一个QLineEdit进行编辑。代码部分不太多:
ui.lineEdit->setPlaceholderText(QStringLiteral("E-mail")); # 设定行编辑框的占位字符
ui.lineEdit->setFixedSize(155, 25);
看看效果:
下面编写QSS代码。先考虑下外观应该定制的有哪些方面:边框、背景色、圆角、鼠标悬停时、文本大小,大概差不多了:
QLineEdit {
border: 1px solid rgb(41, 57, 85); # 边框1px宽,颜色为深紫色
border-radius: 3px; # 给定3px边框圆角
background: white; # 背景色定为白色吧
selection-background-color: green; # 这个属性设定文本选中时的文本背景色
font-size: 14px ; # 文本的大小
} QLineEdit:hover {
border: 1px solid blue; # 鼠标悬停时,我们将编辑框的边框设置为蓝色
}
效果还不错。下面我们来看看行编辑框的另外一个应用:密码输入框。在默认情况下,当行编辑框用于密码输入时,其效果如下:
利用QSS中的lineedit-password-character属性,我们可以更改密文显示字符内容。QSS代码如下:
QLineEdit[echoMode="2"] {
lineedit-password-character: 35;
}
注意到这里我们使用了一个属性选择器来进行选择,就是当QLineEdit对象的echoMode属性值为2时,我们将他们的密文显示字符设置为其他值。这里我们设置成了35,这是一个ASCII码值,在ASCII码中对应字符为‘#’。因此:
当然,我们还可以换成其他的字符,如‘*’。‘*’对应的ASCII码值为42,最终看起来将是:
当然,默认的圆点形式的密文还是更为常见。到底用哪种密文字符还是随个人喜好了。另外,QLineEdit还有一个伪状态:readonly,利用这个伪状态,我们可以设置编辑框禁用时的外观。
自动补全
自动补全是个非常人性化的功能。无论实在面向程序员的代码编辑器中,还是面向终端用户的软件产品中,自动补全都能为工作效率和用户体验带来极大的提升。文本编辑框的自动补全功能在数据过滤器中使用较为常见,用于过滤不相干数据直奔目标数据。在WEB表单中也经常可以看到其的身影,如下是腾讯某产品的一个注册页面:
当用户输入邮箱名的时候,编辑框会自动补全邮箱后缀部分。用户输入完邮箱名之后即可选择邮箱类型,也可以让用户看到支持的邮箱类型。在WEB前端开发中,这样的功能已经有相关的JS提供,直接调用就可以实现。我们接下来就是尝试实现Qt版的邮箱补全功能。
说实话,Qt下面的自动补全功能实现起来更加简单。因为Qt库本身就提供了一个类QCompleter来完成这个功能。而且使用起来也很简单,直接调用QLineEdit的setCompleter()即可完成。我们在实现代码中添加如下代码:
m_model = new QStandardItemModel(0, 1, this);
m_completer = new QCompleter(m_model, this);
ui.lineEdit->setCompleter(m_completer); connect(m_completer, SIGNAL(activated(const QString&)), this, SLOT(onEmailChoosed(const QString&)));
connect(ui.lineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(onTextChanged(const QString&)));
在这里,我们使用了一个Model类来存储数据。大致的原理就是,当用户输入发生变化时,我们将文本内容提取出来添加一个邮箱后缀并保存到Model类中。因为我们已经将这个Model类设置成了QCompleter类的Model,因此当我们更新Model类的数据时,QCompleter的下拉列表的内容也会同步更新。我们还要实现两个槽函数来响应文本变化信号和列表项激活的信号:
void ThemeRoller::onEmailChoosed(const QString& email)
{
ui.lineEdit->clear(); // 清除已存在的文本更新内容
ui.lineEdit->setText(email);
} void ThemeRoller::onTextChanged(const QString& str)
{
if (str.contains("@")) // 如果已经输入了@符号,我们就停止补全了。因为到了这一步,我们再补全意义也不大了。
{
return;
}
QStringList strlist;
strlist << "@163.com" << "@qq.com" << "@gmail.com" << "@hotmail.com" << "@126.com"; m_model->removeRows(0, m_model->rowCount()); // 先清楚已经存在的数据,不然的话每次文本变更都会插入数据,最后出现重复数据
for (int i = 0; i < strlist.size(); ++i)
{
m_model->insertRow(0);
m_model->setData(m_model->index(0, 0), str + strlist.at(i));
}
}
如上代码中的注释所说,将信号activated()连接到槽onEmailChoosed()。当用户用鼠标选择了某一项之后就把选中的项更新到文本框中,补全完成。信号textChanged()连接到onTextChanged()用于更新Model中的数据。我们的做法也很简单,在用户的输入文本后追加邮箱后缀再插入到model中去,这样就实现了动态更新。
定制效果
实现起来还是挺简单的。存在的一个缺陷是,当我们快速输入或删除文本时,补全列表偶尔会出现闪烁的迹象。这是由于数据更新造成的延迟现象。
小结
1. QLineEdit的外观属性,重要的属性:lineedit-password-character.
2. QCompleter和QLineEdit搭配使用。
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全的更多相关文章
- Qt Style Sheet实践(一):按钮及关联菜单(24K纯开源,一共四篇)
导读 正如web前端开发中CSS(Cascade Style Sheet)的作用一样,Qt开发中也可以使用修改版的QSS将逻辑业务和用户界面进行隔离.这样,美工设计人员和逻辑实现者可以各司其职而不受干 ...
- Qt Style Sheet实践(一):按钮及关联菜单
导读 正如web前端开发中CSS(Cascade Style Sheet)的作用一样,Qt开发中也可以使用修改版的QSS将逻辑业务和用户界面进行隔离.这样,美工设计人员和逻辑实现者可以各司其职而不受干 ...
- Qt Style Sheet实践(二):组合框QComboBox的定制
导读 组合框是一个重要且应用广泛的组件,一般由两个子组件组成:文本下拉单部分和按钮部分.在许多既需要用户选择.又需要用户手动输入的应用场景下,组合框能够很好的满足我们的需求.如我们经常使用的聊天软件Q ...
- Qt Style Sheet实践(二):组合框QComboBox的定制(24K纯开源)——非常漂亮
组合框是一个重要且应用广泛的组件,一般由两个子组件组成:文本下拉单部分和按钮部分.在许多既需要用户选择.又需要用户手动输入的应用场景下,组合框能够很好的满足我们的需求.如我们经常使用的聊天软件QQ登录 ...
- Qt Style Sheet实践(三):QCheckBox和QRadioButton
导读 单选按钮(QRadioButton)和复选框(QCheckBox)是界面设计中的重要元素.单选按钮只允许用户在一组选项中选择一个,且当其中一个被选中的时候,按钮组中的其他单选按钮自动取消.复选框 ...
- Mycil命令行MySQL语法高亮和自动补全工具
MyCli 是MySQL,MariaDB和Percona的命令行界面,具有自动完成和语法高亮的功能. 其效果如图: 那么我们应该怎么安装它呢,这里附上windows的安装方法. 在命令行下输入 pip ...
- 【Qt编程】基于Qt的词典开发系列<十四>自动补全功能
最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项).这个自动补全功能十分常见,百度搜索关键词时就会出现.不过它们这些补全功能都是与你输入的进行 ...
- 下拉框、下拉控件之Select2。自动补全的使用
参考链接: 参考一:https://blog.csdn.net/weixin_36146275/article/details/79336158 参考二:https://www.cnblogs.com ...
- Qt 外观之一 ——Qt Style Sheet
Qt Style Sheet 目录 使用 对于应用程序 创建自定义控件 QSS语法 一般选择器(selector) 伪选择器 解决冲突 使用specificity Namespace冲突 级联效应 设 ...
随机推荐
- ASP.NET MVC验证标注的扩展-checkbox必选
我们知道ASP.NET mvc提供一些表单的验证标注,比如必填属性RequiredAttribute 但是这个属性不适合选择框的必选 但是很多时候,我们却是需要一些必选的单选框 比如网站注册的时候,需 ...
- 解决Maven关于本地jar包的打包处理
在使用maven进行jar包管理时,通过我们都是通过maven去下载一些jar包,但有些jar在maven上没有,所以就就可能在本地直接手动加入一些需要用到的外部jar包.但如果我们用maven pa ...
- 【转】iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?
本文讲诉的主要是为什么苹果2011年8月发布iOS 5后就开始拒绝App获取设备的UDID以及UDID替补方案,特别提醒开发者苹果App Store禁止访问UDID的应用上架(相关推荐:APP被苹果A ...
- CSS3学习笔记--line-height:150%与line-height:1.5的真正区别
代码: <div style="line-height:150%;font-size:16px;"> 父元素内容 <div style="font-si ...
- C#集合 -- Lists,Queues, Stacks 和 Sets
List<T>和ArrayList Generic的List和非Generic的ArrayList类支持可变化大小的对象数组,它们也是最常见的集合类.ArrayList实现了IList接口 ...
- C++ STL轻松导学
作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的.STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现.本教程旨在传播和普及STL的基础知识,若能借此机 ...
- 编译 curl with ssl
安装 openssh后,使用 curl 的 ./configure --with-ssl 时,报错“找不到 ssl”.因为 curl在 /usr/local/ssl的安装目录下找动态连接库.而ssl默 ...
- CSS-JQUERY笔记
Ready $(document).ready(function(){ }) Input_div_span Input-长度限制 <input maxLength="2"&g ...
- WinStore控件之Button
1 Buton入门简单应用 <StackPanel > <Button Content="按钮1" Height="80" Name=&quo ...
- LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
题目: Given a , and there exists one unique longest palindromic substring. 解题思路:1.简单思路:暴力破解法,时间复杂度O(n^ ...