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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM