2021.6.6:QT——QComboBox下拉框及用法

QComboBox是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当做一个QLineEdit用作输入QComboBox除了显示可见下拉列表外,每个Item还可以关联一个QVariant类型变量,用于存储一些不可见的数据

samp4_6演示QComboBoxQPlainTextEdit(后者以后会讲)的使用,运行时界面如下图所示:

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);

添加具有用户数据ItemQComboBox::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 )

这两个信号只是传递的参数不同,一个是当前ItemIndex,另一个是当前ItemText

为了使用方便,选择为currentIndexChanged( QString text )信号编写槽函数。窗体上只在PlainText中显示comboBoxItem ListQString 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);
}

 

posted @ 2021-06-06 23:49  ShineLe  阅读(4718)  评论(0编辑  收藏  举报