《QT 108好類》之16 QComboBox類

《QT 108好類》之16 QComboBox類

  • QT 108好類之16 QComboBox類
  • QComboBox類特性和應用場景
  • QComboBox類繼承關系
  • QComboBox類使用
    • 1 簡單使用
    • 2 表單輸入
    • 3 使用自定義模型和視圖
    • 4 完全自定義彈出窗口
  • QComboBox類類使用效果

QT 108好類之16 QComboBox類

QComboBox是 常用的下拉框,它提供了一個下拉列表供用戶選擇選項。它結合了按鈕和一個彈出的下拉列表(包含所有可選項)。

QComboBox類特性和應用場景

特性
1.??項目存儲:??可以存儲文本項 (QString)。可以存儲圖標項 (QIcon)。可以存儲用戶自定義數據 (QVariant),通過 setItemData()關聯到每個項上。可以存儲 QStandardItem對象(當使用模型/視圖架構時)。

2.??顯示:??顯示當前選中的項(文本和/或圖標)。點擊按鈕或使用鍵盤展開下拉列表顯示所有選項。下拉列表可以是滾動列表),也可以是列表視圖(需要自定義視圖)。

3.??可編輯性:??默認是不可編輯的(用戶只能從列表中選擇)。可以通過 setEditable(true)設置為可編輯。此時:用戶可以直接在行編輯區域輸入文本。通常會啟用自動補全 (setCompleter())。可以設置驗證器 (setValidator()) 限制輸入內容。當用戶輸入時,下拉列表會根據輸入內容進行過濾(如果啟用了)。

4.??模型/視圖支持:??繼承自 QAbstractItemView,因此支持模型/視圖架構。可以使用 setModel()設置一個數據模型來管理其內容,實現更動態和復雜的數據展示。可以使用 setView()設置自定義視圖來顯示下拉列表,實現多列顯示等高級效果。

應用場景
1.??設置/配置對話框:??選擇語言、主題、單位制、分辨率、音質等級別等。選擇連接端口、網絡接口。選擇文件格式、編碼方式。
2.??數據篩選/分類:??在表格或列表上方,提供下拉菜單篩選特定類別(如“所有產品”、“電子產品”、“書籍”)。選擇日期范圍(如“今天”、“本周”、“本月”、“自定義”)。
3.??表單輸入:??選擇國家、省份、城市。選擇性別、職業、教育程度等固定分類信息。選擇產品型號、規格。
4.??導航/視圖切換:??在標簽頁或工具欄中,提供下拉菜單切換不同的視圖或工作區。
5.??命令選擇:??提供一組命令或操作供用戶選擇(有時會配合工具欄按鈕使用)。
6.??動態內容加載:??第一個下拉框選擇大類(如“汽車品牌”),第二個下拉框根據第一個的選擇動態加載小類(如該品牌下的“車型”)。
7.??搜索/過濾(可編輯模式):??用戶可以直接輸入文本進行搜索,下拉列表實時顯示匹配項。

QComboBox類繼承關系

QComboBox類繼承自QWidget
QComboBox類繼承關系

QComboBox類使用

??常用方法:??
addItem(const QString &text, const QVariant &userData = QVariant()): 添加一個文本項(可選附帶用戶數據)。
addItem(const QIcon &icon, const QString &text, const QVariant &userData = QVariant()): 添加一個帶圖標的文本項。
insertItem(int index, …): 在指定索引處插入項。
removeItem(int index): 移除指定索引的項。
clear(): 移除所有項。
setCurrentIndex(int index): 設置當前選中的索引。
setCurrentText(const QString &text): 設置當前文本(在可編輯模式下直接設置文本;在不可編輯模式下,會查找匹配文本的項并選中)。
currentIndex(): 獲取當前選中項的索引(如果沒有選中項,返回 -1)。
currentText(): 獲取當前選中項的文本(在可編輯模式下,返回行編輯框中的文本)。
currentData(int role = Qt::UserRole): 獲取當前選中項關聯的用戶數據(默認 Qt::UserRole)。
itemText(int index): 獲取指定索引項的文本。
itemData(int index, int role = Qt::UserRole): 獲取指定索引項關聯的用戶數據。
count(): 獲取項的數量。
setEditable(bool editable): 設置是否可編輯。
setModel(QAbstractItemModel *model): 設置數據模型。
setView(QAbstractItemView *itemView): 設置下拉列表使用的視圖。
setCompleter(QCompleter *completer): 設置自動補全器(通常用于可編輯模式)。
setValidator(const QValidator *validator): 設置驗證器(用于可編輯模式限制輸入)。

信號:??
currentIndexChanged(int index): 當前選中項的索引改變時觸發(最常用)。
currentTextChanged(const QString &text): 當前選中項的文本改變時觸發(在可編輯模式下,用戶輸入也會觸發)。
activated(int index): 用戶激活(選中)了一個項時觸發(通常是通過鼠標點擊或回車鍵確認選擇)。
textActivated(const QString &text): 用戶激活(選中)了一個項時觸發,提供文本。
highlighted(int index): 用戶在下拉列表中高亮(鼠標懸停或鍵盤導航)了一個項時觸發。
editTextChanged(const QString &text): (僅在可編輯模式下)行編輯框中的文本改變時觸發(用戶輸入時實時觸發)。

1 簡單使用

// 創建一個 QComboBox
QComboBox *comboBox = new QComboBox();
layout->addWidget(comboBox);// 添加選項 (文本)
comboBox->addItem("Option 1");
comboBox->addItem("Option 2");
comboBox->addItem("Option 3");// 添加帶圖標和用戶數據的選項
comboBox->addItem(QIcon(":/images/logo.png"), "Favorite Option", QVariant(42));// 插入一個選項到指定位置
comboBox->insertItem(1, "Inserted Option");// 設置當前選中項 (索引從0開始)
comboBox->setCurrentIndex(2); // 選中 "Option 3"
// 連接信號:當選中項改變時
QObject::connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),[](int index) {qDebug() << "Current index changed to:" << index;
});// 連接信號:當用戶激活(選中)一個項時
QObject::connect(comboBox, QOverload<int>::of(&QComboBox::activated),[comboBox](int index) {QString text = comboBox->itemText(index);QVariant data = comboBox->itemData(index);qDebug() << "Activated item: Index =" << index<< "Text =" << text<< "Data =" << data;
});

2 表單輸入

// 創建標簽
QLabel *countryLabel = new QLabel("國家:", this);
QLabel *provinceLabel = new QLabel("省份:", this);
QLabel *cityLabel = new QLabel("城市:", this);// 創建組合框
QComboBox *countryCombo = new QComboBox(this);
QComboBox *provinceCombo = new QComboBox(this);
QComboBox *cityCombo = new QComboBox(this);// 設置占位符文本
provinceCombo->addItem("-- 請選擇省份 --");
cityCombo->addItem("-- 請選擇城市 --");
QStringList countries;
countries<<"中國" << "美國" << "日本";
countryCombo->addItems(countries);
// 省份數據(按國家分組)
QMap<QString, QStringList> provinces;
provinces["中國"] = QStringList() << "北京" << "上海" << "廣東" << "江蘇" << "浙江";
provinces["美國"] = QStringList() << "加利福尼亞" << "德克薩斯" << "紐約" << "佛羅里達" << "伊利諾伊";
provinces["日本"] = QStringList() << "東京都" << "大阪府" << "北海道" << "愛知縣" << "神奈川縣";// 城市數據(按省份分組)
QMap<QString, QStringList> cities;
cities["北京"] = QStringList() << "北京市";
cities["上海"] = QStringList() << "上海市";
cities["廣東"] = QStringList() << "廣州市" << "深圳市" << "東莞市" << "佛山市";
cities["江蘇"] = QStringList() << "南京市" << "蘇州市" << "無錫市" << "常州市";
cities["浙江"] = QStringList() << "杭州市" << "寧波市" << "溫州市" << "嘉興市";
cities["加利福尼亞"] = QStringList() << "洛杉磯" << "舊金山" << "圣何塞" << "圣地亞哥";
cities["德克薩斯"] = QStringList() << "休斯頓" << "達拉斯" << "奧斯汀" << "圣安東尼奧";
cities["紐約"] = QStringList() << "紐約市" << "布法羅" << "羅切斯特" << "揚克斯";
cities["東京都"] = QStringList() << "東京" << "新宿" << "澀谷" << "品川";
cities["大阪府"] = QStringList() << "大阪" << "堺市" << "高槻市" << "東大阪市";
cities["北海道"] = QStringList() << "札幌" << "函館" << "旭川" << "小樽";// 國家改變時更新省份
connect(countryCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),this, [=](int index){if (index < 0) return;QString country = countryCombo->currentText();provinceCombo->clear();cityCombo->clear();if (provinces.contains(country)) {provinceCombo->addItem("-- 請選擇省份 --");provinceCombo->addItems(provinces[country]);} else {provinceCombo->addItem("-- 無可用省份 --");cityCombo->addItem("-- 無可用城市 --");}
});// 省份改變時更新城市
connect(provinceCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),this, [=](int index){if (index <= 0) { // 0 是 "-- 請選擇省份 --"cityCombo->clear();cityCombo->addItem("-- 請選擇城市 --");return;}QString province = provinceCombo->currentText();cityCombo->clear();if (cities.contains(province)) {cityCombo->addItem("-- 請選擇城市 --");cityCombo->addItems(cities[province]);} else {cityCombo->addItem("-- 無可用城市 --");}
});
QHBoxLayout *hlayout_2 =new QHBoxLayout;
layout->addLayout(hlayout_2);
hlayout_2->addWidget(countryLabel);
hlayout_2->addWidget(countryCombo);
hlayout_2->addWidget(provinceLabel);
hlayout_2->addWidget(provinceCombo);
hlayout_2->addWidget(cityLabel);
hlayout_2->addWidget(cityCombo);

3 使用自定義模型和視圖

QComboBox *comboBox3 =new QComboBox(this);
CustomComboModel *model = new CustomComboModel;
model->appendRow(new QStandardItem("Important Item"));
model->appendRow(new QStandardItem("Normal Item"));
comboBox3->setModel(model);
// 創建自定義視圖(帶復選框)
QListView *listView = new QListView;
listView->setSelectionMode(QAbstractItemView::MultiSelection);
comboBox3->setView(listView);
// 多選處理
connect(comboBox3, QOverload<int>::of(&QComboBox::activated), [=](int index){QModelIndex modelIndex = comboBox3->model()->index(index, 0);Qt::CheckState state = static_cast<Qt::CheckState>(modelIndex.data(Qt::CheckStateRole).toInt());comboBox3->model()->setData(modelIndex,state == Qt::Checked ? Qt::Unchecked : Qt::Checked,Qt::CheckStateRole);
});
layout->addWidget(comboBox3);class CustomComboModel : public QStandardItemModel
{Q_OBJECT
public:explicit CustomComboModel(QObject *parent = nullptr) : QStandardItemModel(parent) {}QVariant data(const QModelIndex &index, int role) const override {if (role == Qt::ForegroundRole && index.row() == 0) {return QColor(Qt::red); // 第一項顯示為紅色}return QStandardItemModel::data(index, role);}
};

4 完全自定義彈出窗口

CustomComboBox2 *Custom_ComboBox2 =new CustomComboBox2(this);
layout->addWidget(Custom_ComboBox2);

需要自己實現 showPopup()和hidePopup()

class CustomComboBox2 : public QComboBox {Q_OBJECT
public:CustomComboBox2(QWidget *parent = nullptr) : QComboBox(parent) {popup = new CustomComboPopup(this);connect(popup, &CustomComboPopup::selected, this, [this](const QString &text) {if (!text.isEmpty()) {qDebug()<<"selected text";clear();// 添加新的文本項addItem(text);// 設置當前索引為新添加的項(即第0項,因為clear后只添加了一項)setCurrentIndex(0);//setCurrentText(text);}});}protected:void showPopup() override {//QPoint pos = mapToGlobal(QPoint(0, height()));//popup->move(pos);//popup->resize(width(), 150); // 設置彈出窗口大小// 計算彈出位置(在組合框下方)QPoint pos = mapToGlobal(QPoint(0, height()));// 移動彈出窗口到正確位置popup->move(pos);// 設置彈出窗口寬度與組合框相同,高度自適應popup->resize(width(), popup->sizeHint().height());popup->show();}void hidePopup() override {// 隱藏彈出窗口if (popup && popup->isVisible()) {popup->hide();}}private:CustomComboPopup *popup;
};class CustomComboPopup : public QWidget
{Q_OBJECT
public:explicit CustomComboPopup(QWidget *parent = nullptr);signals:void selected(const QString &text);
};CustomComboPopup::CustomComboPopup(QWidget *parent)
:QWidget(parent)
{// 關鍵設置:必須設置窗口標志為 PopupsetWindowFlags(Qt::Popup);// 設置模態行為(可選,根據需求)setAttribute(Qt::WA_ShowWithoutActivating);QVBoxLayout *layout = new QVBoxLayout(this);QPushButton *btn1 = new QPushButton("Custom Button 1", this);QPushButton *btn2 = new QPushButton("Custom Button 2", this);QPushButton *btn3 = new QPushButton("Custom Button 3", this);layout->addWidget(btn1);layout->addWidget(btn2);layout->addWidget(btn3);connect(btn1, &QPushButton::clicked,this, [this]() {emit selected("Custom 1");hide();});connect(btn2, &QPushButton::clicked, [this]() { emit selected("Custom 2"); hide(); });connect(btn3, &QPushButton::clicked, [this]() { emit selected("Custom 3"); hide(); });setLayout(layout);// 設置合適的最小大小setMinimumSize(120, 100);
}

QComboBox類類使用效果

QComboBox類類使用效果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96531.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96531.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96531.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目模塊劃分

項目模塊劃分 服務端模塊&#xff1a; 持久化數據管理中心模塊 在數據管理模塊中管理交換機&#xff0c;隊列&#xff0c;隊列綁定&#xff0c;消息等部分數據數據。 \1. 交換機管理&#xff1a; a. 管理信息&#xff1a;名稱&#xff0c;類型&#xff0c;是否持久化標志&#…

小白也能看懂!OpenCV 從零開始安裝配置全教程(包含Windows / Ubuntu / 樹莓派)系統詳細操作配置教程

小白也能看懂&#xff01;OpenCV 從零開始安裝配置全教程&#xff08;包含Windows / Ubuntu / 樹莓派&#xff09;系統詳細操作配置教程 摘要 本教程是面向“小白也能懂”的OpenCV安裝與配置全攻略&#xff0c;涵蓋Windows、Ubuntu和樹莓派三大平臺&#xff0c;真正實現“從零…

【華為云】容器鏡像服務 SWR 詳解:從上傳下載到 ModelArts 應用

前言 華為云容器鏡像服務&#xff08;Software Repository for Container&#xff0c;簡稱 SWR&#xff09;是華為云提供的企業級容器鏡像倉庫服務。它支持 Docker 鏡像的存儲、管理和分發&#xff0c;為容器化應用提供安全可靠的鏡像托管服務。本文將詳細介紹 SWR 的核心功能…

計算機網絡知識點梳理(一)概述:組成、發展、性能、體系結構等

目錄 一、互聯網 &#xff08;1&#xff09;特點 &#xff08;2&#xff09;網絡的組成 &#xff08;3&#xff09;網絡、互連網、因特網 &#xff08;4&#xff09;互聯網發展的三個階段 &#xff08;5&#xff09;標準化 &#xff08;6&#xff09;組成 二、計算機網…

不同行業視角下的數據分析

聲明&#xff1a;以下部分內容含AI生成 基于行業維度來劃分數據分析崗位&#xff0c;可以幫助我們更好地理解不同行業對數據分析技能、業務知識和職業發展的獨特要求。 目錄 一、總體框架&#xff1a;為什么行業維度如此重要&#xff1f; 二、主要行業劃分及詳細講解 1. 互聯…

「CTF」青少年CTF·雛形系統

題目&#xff1a; 解題過程 嘗試隨便輸入點什么&#xff0c;沒有結果 使用dirsearch掃描網址目錄 可以看到有掃描到一個www.zip&#xff0c;zip文件大概率有需要的東西 網址后加上www.zip就能對該文件進行下載 文件解壓縮后如下 打開qsnctf.php&#xff0c;代碼內容如下 <…

Java實戰項目演示代碼及流的使用

project 準備牌->洗牌->發牌 import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet;public class PokerGameplus {static HashMap<Integer,String> hs new HashMap<>();static ArrayList<Int…

使用 OpenLayers + 高德瓦片源實現旅游足跡地圖

作為一個熱愛旅行的開發者&#xff0c;我一直想要一個能夠記錄和展示自己旅游足跡的功能。市面上雖然有很多地圖應用&#xff0c;但大多功能復雜&#xff0c;而我只需要一個簡單直觀的方式來標記去過的地方和想去的地方。 于是我決定在自己的個人網站上實現一個旅游足跡地圖功…

Redis基礎(含常用命令等以快速入門)

一、初步認識 1、NoSQL SQL 關系型數據庫&#xff08;表結構&#xff0c;強一致&#xff09;NoSQL 非關系型數據庫&#xff08;靈活結構&#xff0c;最終一致&#xff0c;水平擴展爽&#xff09; 維度SQL&#xff08;關系型&#xff09;NoSQL&#xff08;非關系型&#xf…

OSPF特殊區域、路由匯總及其他特性

OSPF路由器需要同時維護域內路由、域間路由、外部路由信息數據庫。當網絡規模不斷擴大時&#xff0c;LSDB規模也不斷增長。如果某區域不需要為其他區域提供流量中轉服務&#xff0c;那么該區域內的路由器就沒有必要維護本區域外的鏈路狀態數據庫。OSPF通過劃分區域可以減少網絡…

在緩存Cacheable注解中Key值如何使用常量

1.在常量類中定義商品緩存空間和商品緩存KEY public interface CacheConstants {/*** Goods Cache Name*/String QNA_GOODS_CACHE "qna-goods";/*** Goods Cache key*/String QNA_GOODS_CACHE_KEY "qna_goods:";/*** Order Cache Name*/String QNA_ORDER…

sklearn聚類

在此將sklearn官網的一張關于聚類算法比較的圖片放過來。 下面的表格是根據sklearn官網翻譯而來。 方法名稱 參數 可擴展性 應用場景 幾何度量(距離) MiniBatchKMeans 簇的數量 非常適合處理大量樣本和中等數量的簇(使用MiniBatch時) 通用型,適用于簇大小均勻、幾何形狀平…

Recharts:React圖表庫,組件化設計助力高效數據可視化開發

你寫前端項目時有沒有卡過數據可視化的坑&#xff1f;比如要做個用戶增長折線圖&#xff0c;查了半天原生 JS 教程&#xff0c;寫了幾十行代碼&#xff0c;結果要么坐標軸對不上&#xff0c;要么數據渲染不出來&#xff1b;或者用了某個圖表庫&#xff0c;文檔全是英文&#xf…

Java 中String類的常用方法

Java 中的 String 類提供了豐富的方法用于字符串操作&#xff0c;以下是最常用的一些方法分類總結&#xff1a; 一、獲取字符串信息length()&#xff1a;返回字符串長度&#xff08;字符個數&#xff09; String s "hello"; int len s.length(); // len 5charAt(i…

【記錄】Docker|Docker內部訪問LInux主機上的Ollama服務

部分內容參考自&#xff1a;使得 docker 容器內部可以訪問宿主機的 ollama 服務_docker 訪問 ollama-CSDN 博客&#xff0c;補充添加了更多的細節&#xff0c;也補充了一個更加簡單的方案。 我測試的系統版本&#xff1a;Ubuntu 24.04.2 LTS noble&#xff0c;查看方式是指令 l…

數據庫物理外鍵與邏輯外鍵全解析

一、核心概念 1. 物理外鍵 (Physical Foreign Key) 物理外鍵是數據庫層面通過語法明確創建的外鍵約束。它是由數據庫管理系統&#xff08;DBMS&#xff09;本身&#xff08;如 MySQL, PostgreSQL, Oracle&#xff09;來強制實現的。 它是什么&#xff1a;數據庫表結構的一部分&…

Vue3入門到實戰,最新版vue3+TypeScript前端開發教程,創建Vue3工程,筆記03

筆記03 一、創建Vue3項目 1.1、創建方式 使用vue-cli創建使用vite創建&#xff08;推薦&#xff09;Vue3官網創建項目文檔 兩種創建方式&#xff0c;推薦使用第二種。vue-cli是基于webpack實現的&#xff0c;vite是新一代前端構建工具。 2.1、vue3項目結構

企業如何利用群暉 NAS 構建高效數據備份與容災體系

在數字化轉型的過程中&#xff0c;企業數據已成為核心資產。然而&#xff0c;勒索病毒攻擊、硬件故障、操作失誤以及自然災害等風險&#xff0c;都可能導致數據丟失甚至業務中斷。如何構建一個高效、安全、可恢復的數據備份與容災體系&#xff0c;已成為企業 IT 管理的關鍵課題…

關于在pycharm終端連接服務器

1、先為每個項目創建一個虛擬環境2、使用命令下載torchpip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple安裝之后發現安裝在了本地&#xff0c;我需要安裝到服務器里面&#xff0c;此時可以把本地的刪除&#xff0c;因為是默認安裝到c盤&#xff0c;除非你指定路…

CSS 繼承 (Inheritance)

一、核心概念CSS 繼承是指某些 CSS 屬性如果被設置在父元素上&#xff0c;其值會自動流向&#xff08;應用到&#xff09;其所有后代元素&#xff08;子、孫元素等&#xff09;的特性。核心價值&#xff1a;通過將樣式聲明應用于祖先元素&#xff0c;可以避免在所有后代元素上重…