2021.6.6:QT——QComboBox下拉框及用法
QComboBox是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当做一个QLineEdit用作输入。QComboBox除了显示可见下拉列表外,每个Item还可以关联一个QVariant类型变量,用于存储一些不可见的数据。
例samp4_6演示QComboBox和QPlainTextEdit(后者以后会讲)的使用,运行时界面如下图所示:
QComboBox的用法
属性设置
QComboBox的主要功能是提供一个下拉列表供选择输入。在界面上放置一个QComboBox组件后,双击此组件,可以出现如下图所示对话框,对QComboBox组件的下拉列表项进行编辑。在下图所示的对话框中,可以进行如添加、删除、上移、下移操作,还可以设置Item的图标:
用代码添加简单项
void Widget::on_btnInitItems_clicked() { //"初始化列表"按键 QIcon icon; icon.addFile(":/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));//不带图标 }
添加一个项时,可以指定一个图标,图标来源于资源文件。
addItem()用于添加一个Item,如果只是添加一个QString Item,而且数据来源于一个QStringList变量,可以使用addItems()函数,示例代码如下:
ui->comboBox->clear(); QStringList strList; strList<<"北京"<<"上海"<<"天津"<<"河北省"<<"山东省"<<"陕西省"; ui->combo->addItems(strList);
添加具有用户数据Item的QComboBox::addItem()函数的两种参数原型定义如下:
void addItem( QString text , QVariant userData = QVariant() ) void addItem( QIcon icon , QString text , QVariant userData = QVariant() )
不管是哪个addItem()函数,后面都有一个可选的QVariant类型的参数userData,可以利用这个变量存储用户定义的数据。
界面上另一个ComboBox组件使用了用户数据,“初始化城市 + 区号”按钮的槽函数代码如下:
void Widget::on_btnInit2_clicked() { //初始化具有自定义数据的comboBox //QMap自动根据Key排序 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); ui->comboBox2->clear(); foreach(QString str , City_Zone.keys()) ui->comboBox2->addItem(str,City_Zone.value(str)); }
这里定义了一个QMap<QString , int>City_Zone,用于存储<城市,区号> Map。为City_Zone填充数据后,给comboBox2添加Item时,使用了foreach关键字遍历City_Zone.keys()。添加Item的语句如下:
ui->comboBox2->addItem(str,City_Zone.value(str));
城市名称作为Item显示的QString,电话区号作为关联的用户数据,但是在List中只能看到城市名称。
需要注意的是,将City_Zone的内容添加到List之后,List中显示的Item顺序与源程序中设置的City_Zone顺序不一致,因为QMap<Key,T>会自动按照Key排序。
QComboBox中Item的访问
QComboBox存储的Item是一个List,但是QComboBox不提供整个List用于访问,可以通过索引访问某个Item。访问Item的一些函数主要有以下几种:
- int currentIndex():返回当前Item的Index,第一项的Index是0
- QString currentText():返回当前Item的Text
- QVariant currentData( int role = Qt::UserRole ):返回当前Item的关联Data,第二个参数是角色,将在以后介绍
- QString itemText( int index ):返回指定index的Text
- QVariant itemData( int index , int role = QT::UserRole )返回指定index的关联Data
在一个QComboBox组件上所选的Item发生变化时,会发生如下两个信号:
void currentIndexChanged( int index ) void currentIndexChanged( QString text )
这两个信号只是传递的参数不同,一个是当前Item的Index,另一个是当前Item的Text。
为了使用方便,选择为currentIndexChanged( QString text )信号编写槽函数。窗体上只在PlainText中显示comboBox的Item List的QString Text的槽函数代码如下:
void Widget::on_comboBox_currentIndexChanged( QString arg1 ) { ui->plainTextEdit->appendPlainText(arg1); }
关联有城市区号的comboBox2的槽函数代码如下:
void Widget::on_comboBox2_currentIndexChanged( QString arg1 ) { QString zone = ui->comboBox2->currentData().toString();//Item关联的Data ui->plainTextEdit->appendPlainText(arg1 + ":区号=" +zone); }