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