C++ Qt開發(fā)之ComboBox下拉組合框組件用法詳解
Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹ComboBox下拉組合框組件的常用方法及靈活運(yùn)用。
在Qt中,ComboBox(組合框)是一種常用的用戶界面控件,它提供了一個(gè)下拉列表,允許用戶從預(yù)定義的選項(xiàng)中選擇一個(gè)。該組件提供了一種方便的方式讓用戶從預(yù)定義的選項(xiàng)中進(jìn)行選擇,一般來說ComboBox會(huì)以按鈕的形式顯示在界面上,用戶點(diǎn)擊按鈕后,會(huì)彈出一個(gè)下拉列表,其中包含預(yù)定義的選項(xiàng)。當(dāng)然ComboBox不僅局限于選擇,也允許用戶手動(dòng)輸入內(nèi)容。
下面是QComboBox類的一些常用方法的說明和概述,按照表格形式列出:
方法 | 描述 |
---|---|
QComboBox(QWidget *parent = nullptr) | 構(gòu)造函數(shù),創(chuàng)建一個(gè)組件對(duì)象。 |
addItem(const QString &text, const QVariant &userData = QVariant()) | 向組件添加一個(gè)項(xiàng),可以附帶用戶數(shù)據(jù)。 |
addItems(const QStringList &texts) | 向組件添加多個(gè)項(xiàng),使用字符串列表。 |
insertItem(int index, const QString &text, const QVariant &userData = QVariant()) | 在指定索引處插入一個(gè)項(xiàng)。 |
insertItems(int index, const QStringList &texts) | 在指定索引處插入多個(gè)項(xiàng)。 |
removeItem(int index) | 移除指定索引處的項(xiàng)。 |
clear() | 清除組件中的所有項(xiàng)。 |
setCurrentIndex(int index) | 設(shè)置組件當(dāng)前選擇的項(xiàng)的索引。 |
currentText() | 返回當(dāng)前組件中顯示的文本。 |
currentIndex() | 返回當(dāng)前組件中選擇的項(xiàng)的索引。 |
count() | 返回組件中項(xiàng)的總數(shù)。 |
itemText(int index) | 返回指定索引處項(xiàng)的文本。 |
itemData(int index, int role = Qt::UserRole) | 返回指定索引處項(xiàng)的用戶數(shù)據(jù)。 |
setItemText(int index, const QString &text) | 設(shè)置指定索引處項(xiàng)的文本。 |
setItemData(int index, const QVariant &value, int role = Qt::UserRole) | 為指定索引處項(xiàng)設(shè)置額外的數(shù)據(jù)。 |
clearEditText() | 清除組件的編輯文本。 |
setEditable(bool editable) | 設(shè)置組件是否可編輯。如果可編輯,用戶可以手動(dòng)輸入文本。 |
setMaxCount(int max) | 設(shè)置組件中顯示的最大項(xiàng)數(shù)。如果超過該數(shù)目,將出現(xiàn)垂直滾動(dòng)條。 |
setMinimumContentsLength(int characters) | 設(shè)置組件的最小內(nèi)容長(zhǎng)度,以便顯示完整的項(xiàng)。 |
setModel(QAbstractItemModel *model) | 設(shè)置組件的數(shù)據(jù)模型。通過模型,可以更靈活地管理組件中的項(xiàng)。 |
view() | 返回組件的視圖,允許對(duì)視圖進(jìn)行定制。 |
clear() | 清除組件中的所有項(xiàng)。 |
showPopup() | 打開組件的下拉列表。 |
hidePopup() | 隱藏組件的下拉列表。 |
activated(int index) | 信號(hào),當(dāng)用戶選擇組件中的項(xiàng)時(shí)發(fā)出。 |
currentIndexChanged(int index) | 信號(hào),當(dāng)組件中的當(dāng)前項(xiàng)發(fā)生變化時(shí)發(fā)出。 |
上述這些方法提供了對(duì)ComboBox
進(jìn)行配置、管理和與之交互的靈活性。你可以根據(jù)具體的應(yīng)用需求使用這些方法,使ComboBox
在你的Qt應(yīng)用程序中按照期望的方式工作。
如下圖所示,我們分別增加三個(gè)ComboBox
組件,其中前兩個(gè)組件是默認(rèn)的,最后一個(gè)是Font ComboBox
字體選擇框,其實(shí)該選擇框也是標(biāo)準(zhǔn)選擇框的模板,只不過其默認(rèn)為我們初始化了系統(tǒng)字體方便選擇而已但在使用上與ComboBox
是一致的。
通常情況下使用ComboBox組件與前幾章中所示案例保持一致,只需要通過ui->comboBox_Main->調(diào)用不同的屬性即可實(shí)現(xiàn)賦值或取值,此處我們來演示一個(gè)更復(fù)雜的需求,實(shí)現(xiàn)選擇組件的聯(lián)動(dòng)效果,即用戶選擇主選擇框時(shí)自動(dòng)列出該主選擇框的子項(xiàng),這也是開發(fā)中最常見的需求。
首先我們先來演示一下如何向Main選擇框內(nèi)批量追加選項(xiàng),為了能更好的展示圖標(biāo)的導(dǎo)入,此處分別增加browser alt.ico和ksirtet.ico兩個(gè)ICO圖標(biāo),讀者可通過 《C++ Qt開發(fā):PushButton按鈕組件》中所使用的方法將圖標(biāo)導(dǎo)入,接著在主函數(shù)初始化中我們可以使用以下代碼將其初始化。
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QIcon icon; icon.addFile(":/image/ksirtet.ico"); // 填充第一個(gè)Main for(int x=0;x<10;x++) { ui->comboBox_Main->addItem(icon,QString::asprintf("元素_%d",x)); } // 填充第二個(gè)SubMain icon.addFile(":/image/browser alt.ico"); for(int x=0;x<10;x++) { ui->comboBox_SubMain->addItem(icon,QString::asprintf("元素_%d",x)); } }
運(yùn)行上述代碼片段,則可以輸出如下圖所示的效果,可以看到兩個(gè)選擇框已被初始化。
接著我們來實(shí)現(xiàn)菜單的聯(lián)動(dòng),該功能的實(shí)現(xiàn)依賴于QMap
容器,其中Key定義地區(qū),而Value值則定義一個(gè)QList
該容器類存儲(chǔ)特定地區(qū)的城市,如下核心代碼中MainWindow
用于初始化,將默認(rèn)的comboBox_Main
填充為四大地區(qū),依次初始化map
容器映射。
#include <iostream> #include <QList> #include <QMap> // -------------------------------------- // 定義全局變量 // -------------------------------------- // 存儲(chǔ)城市與ID QMap<QString,int> City_Zone; // 存儲(chǔ)地區(qū)與城市 QMap<QString,QList <QString>> map; // 臨時(shí)變量 QList<QString> tmp; MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // -------------------------------------------- // comboBox_Main設(shè)置主菜單 ui->comboBox_Main->clear(); QStringList str; str << "北京" << "上海" << "廣州" << "深圳"; // 添加元素到主菜單 ui->comboBox_Main->addItems(str); // 依次設(shè)置圖標(biāo) ui->comboBox_Main->setItemIcon(0,QIcon(":/image/ksirtet.ico")); ui->comboBox_Main->setItemIcon(1,QIcon(":/image/ksirtet.ico")); ui->comboBox_Main->setItemIcon(2,QIcon(":/image/ksirtet.ico")); ui->comboBox_Main->setItemIcon(3,QIcon(":/image/ksirtet.ico")); // -------------------------------------------- // 設(shè)置城市和序號(hào) ui->comboBox_Main->clear(); City_Zone.insert("請(qǐng)選擇",0); City_Zone.insert("北京",1); City_Zone.insert("上海",2); City_Zone.insert("廣州",3); City_Zone.insert("深圳",4); // -------------------------------------------- // 循環(huán)填充一級(jí)菜單 ui->comboBox_Main->clear(); foreach(const QString &str,City_Zone.keys()) { ui->comboBox_Main->addItem(QIcon(":/image/ksirtet.ico"),str,City_Zone.value(str)); } // -------------------------------------------- // 插入二級(jí)菜單 tmp.clear(); tmp << "大興區(qū)" << "昌平區(qū)" << "東城區(qū)" << "西城區(qū)"; map["北京"] = tmp; tmp.clear(); tmp << "黃浦區(qū)" << "徐匯區(qū)" << "長(zhǎng)寧區(qū)" << "楊浦區(qū)"; map["上海"] = tmp; tmp.clear(); tmp << "荔灣區(qū)" << "越秀區(qū)" << "花都區(qū)" << "增城區(qū)"; map["廣州"] = tmp; tmp.clear(); tmp << "羅湖區(qū)" << "福田區(qū)" << "龍崗區(qū)" << "光明區(qū)"; map["深圳"] = tmp; // 設(shè)置默認(rèn)選擇第4個(gè) ui->comboBox_Main->setCurrentIndex(4); }
菜單聯(lián)動(dòng)的第二部則是對(duì)特定槽函數(shù)的實(shí)現(xiàn),當(dāng)我們點(diǎn)擊comboBox_Main
組件時(shí),觸發(fā)currentTextChanged(QString)
槽函數(shù),此時(shí)只需要在全局map
容器內(nèi)提取出所需要的子標(biāo)簽,并依次賦值到comboBox_SubMain
組件內(nèi)即可,代碼如下所示;
// 觸發(fā)子標(biāo)簽填充 void MainWindow::on_comboBox_Main_currentTextChanged(const QString &arg1) { ui->comboBox_SubMain->clear(); QList<QString> qtmp; qtmp = map.value(arg1); for(int x=0;x<qtmp.count();x++) { ui->comboBox_SubMain->addItem(QIcon(":/image/browser alt.ico"),qtmp[x]); } } // 觸發(fā)按鈕點(diǎn)擊 void MainWindow::on_pushButton_clicked() { QString one = ui->comboBox_Main->currentText(); QString two = ui->comboBox_SubMain->currentText(); std::cout << one.toStdString().data() << " | " << two.toStdString().data() << std::endl; }
運(yùn)行后輸出效果如下,當(dāng)讀者選擇主選擇框時(shí)子選擇框?qū)⒈惶畛?,此時(shí)讀者只需要根據(jù)標(biāo)簽號(hào)的對(duì)應(yīng)關(guān)系,即可判斷用戶選擇了那個(gè)選項(xiàng)。
以上就是C++ Qt開發(fā)之ComboBox下拉組合框組件用法詳解的詳細(xì)內(nèi)容,更多關(guān)于C++ ComboBox組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++調(diào)用Python基礎(chǔ)功能實(shí)例詳解
c++調(diào)用Python首先安裝Python,本文以win7為例,給大家詳細(xì)介紹C++調(diào)用Python基礎(chǔ)功能,需要的朋友參考下吧2017-04-04使用代碼驗(yàn)證linux子進(jìn)程與父進(jìn)程的關(guān)系
Linux下父進(jìn)程可以使用fork 函數(shù)創(chuàng)建子進(jìn)程,但是當(dāng)父進(jìn)程先退出后,子進(jìn)程會(huì)不會(huì)也退出呢?通過下面這個(gè)小實(shí)驗(yàn),我們能夠很好的看出來2014-02-02關(guān)于C++靜態(tài)成員函數(shù)訪問非靜態(tài)成員變量的問題
靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員,這是因?yàn)殪o態(tài)函數(shù)屬于類而不是屬于整個(gè)對(duì)象,靜態(tài)函數(shù)中的 member可能都沒有分配內(nèi)存。靜態(tài)成員函數(shù)沒有隱含的this自變量。所以,它就無法訪問自己類的非靜態(tài)成員2013-10-10C++分析構(gòu)造函數(shù)與析造函數(shù)的特點(diǎn)梳理
本文對(duì)類的構(gòu)造函數(shù)和析構(gòu)函數(shù)進(jìn)行總結(jié),主要包括了構(gòu)造函數(shù)的初始化、重載、使用參數(shù)和默認(rèn)參數(shù),拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù),希望能幫助讀者在程序開發(fā)中更好的理解類,屬于C/C++基礎(chǔ)2022-05-05詳解C++?functional庫(kù)中的仿函數(shù)使用方法
仿函數(shù)(functor)又稱之為函數(shù)對(duì)象(function?object),實(shí)際上就是?重載了()操作符?的?struct或class。本文將詳細(xì)講解C++中仿函數(shù)的使用方法,需要的可以參考一下2022-04-04opencv3/C++實(shí)現(xiàn)光流點(diǎn)追蹤
今天小編就為大家分享一篇opencv3/C++實(shí)現(xiàn)光流點(diǎn)追蹤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12C++超詳細(xì)分析講解內(nèi)聯(lián)函數(shù)
為了消除函數(shù)調(diào)用的時(shí)空開銷,C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語(yǔ)言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)2022-06-06