目录
2.7 QComboBox和QPlainTextEdit的组合应用
1.QComboBox
1.1 QComboBox概述
QComboBox是下拉列表框组件类,它提供一个下拉列表供用户选择,选择的项目内容就会显示在外面,其他项目会被隐藏,同时在下拉时之前选择的项目位置会被标记好,可以理解显示的项目其实是一个之前选择位置项目的副本。这个控件其实预制很很多选项给用户选择,减少手动输入的麻烦。也可以QComboBox也直接当作一个QLineEdit用作输入。QComboBox除了显示可见下拉列表外,每个项(item,或称列表项)还可以关联一个QVariant类型的变量,用于存储一些不可见数据。QComBox可以是可编辑的,允许用户修改列表中的每个项目,如添加、删除、上移、下移操作,还可以设置项的图标,但是这个不会影响到预先设置项目。
1.2 QComboBox信号
如果QComBox的当前项发生变化,则发出两个信号,urrentIndexChanged() 和 activated()。无论更改是通过编程方式还是通过用户交互完成的,始终发出 currentIndexChanged(),而 active() 仅在更改由用户交互引起时发出。当用户突出显示QComBox弹出列表中的项目时,将发出 highlighted() 信号。所有三个信号都存在两个版本,一个带有QString参数,另一个带有int参数。如果用户选择或突出显示像素图,则仅发出 int 信号。每当可编辑QComBox的文本发生更改时,都会发出 editTextChanged() 信号。
1.3 QComboBox常用功能
当用户在可编辑QComBox中插入新项目(字符串)的时候,还是有一个插入的策略。默认策略是 InsertAtBottom,但您可以使用 setInsertPolicy() 更改此设置。
可以使用 QValidator 将输入限制为可编辑的QComBox;参见 setValidator()。默认情况下,接受任何输入。
QComBox提供了很多好用的功能。
-
可以使用插入单个、多个Item,例如 insertItem() 和 insertItems()
-
可以使用 setItemText() 修改项目
-
可以使用 removeItem() 删除项目
-
可以使用 clear() 删除所有项目
-
当前项的文本由 currentText() 返回,编号项的文本与 text() 一起返回
-
可以使用 setCurrentIndex() 设置当前项
-
QComBox中的项目个数由 count() 返回
-
可以使用 setMaxCount() 设置的最大项目数
-
还可以用 setEditable() 是否可编辑 等等
对于可编辑的QComBox,您可以使用 setCompleter() 设置自动补全,就是输入一部分内容,就显示一个可能选择列表,等后面专门用 QCompleter 来完成。
1.4 QComboBox添加简单项
QComBox可以包含像素图以及字符串;可以用 insertItem() 和 setItemText() 的相关重置函数来插入带图标的列表项。
对于可编辑的QComBox,提供了函数 clearEditText(),用于清除显示的字符串而不更改QComBox的内容。(其实就是只是修改当前的显示内容,之前预制的项目还是不会被修改。)
void Widget::on_btnIniItemsclicked()
{//"初始化列表"按钮
QIcon icon;
icon.addFiIe(":/images/icons/aim.ico");
ui—>comboBox—>clear();
for(int i=0;i<20;i++){
ui—>comboBox—>addItem(icon,QString::asprintf("Item %d",i));//带图标
//ui—>comboBox—>addItem(QString::asprintf("Item %d",i));//不带图标
}
添加一个项时可以指定一个图标,图标来源于资源文件。
addltem()用于添加一个列表项,如果只是添加字符串列表项,而且数据来源于一个QStringList变量,可以使用addltems()函数,示例代码如下:
ui—>comboBox—>clear();
QStringList strList;
strList<<"北京"<<"上海"<<"天津"<<"河北省"<<"山东省"<<"山西省";
ui—>comboBox—>addItems(strList);
1.5 QComboBox添加具有用户数据的项
QComboBox::addItem()函数的两种参数的原型定义如下:
void addltem(const QString &text,const QVariant &userData = QVariant())
void addltem(const QIcon &ico,const QString &text,const QVariant &userData =
QVariant())
不管是哪一个addltem()函数,后面都有一个可选的QVariant类型的参数userData,可以利用
这个变量存储用户定义数据。
这里定义了一个关联容器类QMap<QString,int>City_Zone,用于存储<城市,区号>映射表。为City_Zone填充数据后,给comboBox2添加项时,使用了foreach关键字遍历City_Zone.keys()。
按钮信号触发ComboBox组件使用用户数据,“初始化城市+区号”按钮的槽函数代码如下:
void Widget::on_btnIni2_clicked()
{//初始化具有自定义数据的
QMap<QString,int> City_Zone;
City_Zone.insert("北京",10);
City_Zone.insert("上海",21);
City_Zone.insert("天津",22);
City_Zone.insert("大连",411);
City_Zone.insert("锦州",416);
City_Zone.insert("徐州",516);
City_Zone.insert("福州",591);
City_Zone.insert"青岛",532);
ui->comboBox2->c1ear();
foreach(const QString &str,City_Zone.keys())
//添加项语句如下:城市名称作为项显示的字符串,电话区号作为项关联的用户数据,但是在列表框里只能看到
城市名称。
ui->comboBox2->addItem(str,City_Zone.value(str));
//注意:将City_zone的内容添加到列表框之后,列表框里显示的列表项的顺序与源程序中设置City_zone的顺序不一致,因为QMap<Key,T>容器类会自动按照Key排序。
1.6 QComboBox列表项的访问
QComboBox存储的项是一个列表,但是QComboBox不提供整个列表用于访问,可以通过索引访问某个项。访问项的一些函数主要有以下几种。
-
int currentlndex(),返回当前项的序号,第一个项的序号为0。
-
QString currentText(),返回当前项的文字。
-
QVariant currentData(int role= Qt::UserRole),返回当前项的关联数据,数据的缺省角色为role:Qt::UserRole
-
QString itemText(int index),返回指定索引号的项的文字。
-
QVariant itemData(int index,int role=Qt::UserRole),返回指定索引号的项的关联数据。
-
int count()&