微信公眾官網(wǎng)登錄入口整站seo排名外包
Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹ListWidget
列表框組件的常用方法及靈活運(yùn)用。
QListWidget
是 Qt 中的一個(gè)列表框組件,用于顯示一列項(xiàng)目,并允許用戶進(jìn)行選擇。每個(gè)項(xiàng)目可以包含一個(gè)圖標(biāo)和文本,可以使用 QListWidgetItem
類來表示。ListWidget
組件與TreeWidget
有些相似,區(qū)別在于TreeWidget
可以實(shí)現(xiàn)嵌套以及多字段結(jié)構(gòu),而ListWidget
則只能實(shí)現(xiàn)單字段結(jié)構(gòu),該組件常用于顯示單條記錄,例如只顯示IP
地址,用戶名等數(shù)據(jù)。
以下是 QListWidget
類的一些常用方法,說明和概述:
方法 | 描述 |
---|---|
addItem(QListWidgetItem *item) | 向列表中添加一個(gè)項(xiàng)目。 |
addItems(const QStringList &labels) | 向列表中添加多個(gè)項(xiàng)目。 |
count() | 返回列表中的項(xiàng)目數(shù)量。 |
currentItem() | 返回當(dāng)前選擇的項(xiàng)目。 |
item(int row) | 返回給定行索引的項(xiàng)目。 |
itemAt(const QPoint &p) | 返回給定坐標(biāo)處的項(xiàng)目。 |
takeItem(int row) | 從列表中刪除并返回給定行索引的項(xiàng)目。 |
clear() | 刪除列表中的所有項(xiàng)目。 |
clearSelection() | 取消選擇所有項(xiàng)目。 |
removeItemWidget(QListWidgetItem *item) | 從列表中刪除一個(gè)項(xiàng)目并釋放與之關(guān)聯(lián)的任何小部件。 |
scrollToItem(QListWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible) | 滾動(dòng)列表以確保給定項(xiàng)目可見。 |
sortItems(Qt::SortOrder order = Qt::AscendingOrder) | 對列表中的項(xiàng)目進(jìn)行排序。 |
itemClicked(QListWidgetItem *item) | 項(xiàng)目被點(diǎn)擊時(shí)發(fā)出的信號。 |
itemDoubleClicked(QListWidgetItem *item) | 項(xiàng)目被雙擊時(shí)發(fā)出的信號。 |
setItemWidget(QListWidgetItem *item, QWidget *widget) | 在給定項(xiàng)目的位置設(shè)置小部件。 |
setIconSize(const QSize &size) | 設(shè)置項(xiàng)目圖標(biāo)的大小。 |
setCurrentRow(int row) | 設(shè)置當(dāng)前選擇的行。 |
setCurrentItem(QListWidgetItem *item) | 設(shè)置當(dāng)前選擇的項(xiàng)目。 |
selectedItems() | 返回當(dāng)前選擇的所有項(xiàng)目。 |
selectedIndexes() | 返回當(dāng)前選擇的所有項(xiàng)目的模型索引。 |
setSelectionMode(QAbstractItemView::SelectionMode mode) | 設(shè)置選擇模式,例如 SingleSelection 或 MultiSelection 。 |
這只是 QListWidget
類的一部分方法。你可以查閱官方文檔以獲取完整的方法列表,以及這些方法的詳細(xì)說明。
首先讀者可自行繪制好如下所示的UI界面,在界面中左側(cè)包含一個(gè)ListWidget
列表框,右側(cè)包含各類用于控制組件的pushButton
按鈕,如下圖所示;
1.1 初始化節(jié)點(diǎn)
如下代碼是一個(gè)槽函數(shù) on_pushButton_init_clicked
,主要作用是初始化一個(gè) QListWidget
列表框,其中包含了一系列的 QListWidgetItem
項(xiàng)。
以下是概述:
- 清空列表框: 首先,通過
ui->listWidget->clear()
清空了列表框,以確保在初始化之前移除已有的項(xiàng)。 - 循環(huán)初始化項(xiàng): 使用
for
循環(huán),遍歷了 0 到 9 的數(shù)字,共初始化了 10 個(gè)項(xiàng)。 - 創(chuàng)建
QListWidgetItem
: 對于每個(gè)循環(huán),通過new QListWidgetItem()
創(chuàng)建了一個(gè)新的QListWidgetItem
對象aItem
。 - 設(shè)置文本標(biāo)簽: 使用
setText
方法為QListWidgetItem
設(shè)置了文本標(biāo)簽,內(nèi)容是形如 “192.168.1.x” 的字符串。 - 設(shè)置圖標(biāo): 使用
setIcon
方法為每個(gè)項(xiàng)設(shè)置了相同的圖標(biāo),這里使用了名為 “1.ico” 的圖標(biāo)。 - 設(shè)置為選中狀態(tài): 使用
setCheckState
方法將每個(gè)項(xiàng)設(shè)為選中狀態(tài),即顯示復(fù)選框并勾選。 - 設(shè)置不可編輯狀態(tài): 使用
setFlags
方法將每個(gè)項(xiàng)設(shè)置為不可編輯狀態(tài),只允許選擇和檢查操作。 - 增加項(xiàng)到列表中: 使用
ui->listWidget->addItem(aItem)
將每個(gè)項(xiàng)添加到QListWidget
中。
該槽函數(shù)用于初始化一個(gè)包含特定圖標(biāo)、文本、復(fù)選框等屬性的 QListWidget
,方便用戶進(jìn)行選擇和操作。
// 初始化列表
void MainWindow::on_pushButton_init_clicked()
{// 每一行是一個(gè)QListWidgetItemQListWidgetItem *aItem;// 設(shè)置ICON的圖標(biāo)QIcon aIcon;aIcon.addFile(":/image/1.ico");// 清空列表框ui->listWidget->clear();// 循環(huán)初始化for(int x=0;x<10;x++){// 填充字符串QString str = QString::asprintf("192.168.1.%d",x);// 新建一個(gè)項(xiàng)aItem = new QListWidgetItem();aItem->setText(str); // 設(shè)置文字標(biāo)簽aItem->setIcon(aIcon); // 設(shè)置圖標(biāo)aItem->setCheckState(Qt::Checked); // 設(shè)為選中狀態(tài)aItem->setFlags(Qt::ItemIsSelectable | // 設(shè)置為不可編輯狀態(tài)Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);// 增加項(xiàng)到列表中ui->listWidget->addItem(aItem);}
}
運(yùn)行效果如下圖;
1.2 設(shè)置編輯狀態(tài)
如下槽函數(shù) on_pushButton_edit_clicked
的主要功能是將所有項(xiàng)設(shè)置為可編輯狀態(tài)。
以下是概述:
- 獲取所有項(xiàng)數(shù)量: 使用
ui->listWidget->count()
獲取列表框中的項(xiàng)的數(shù)量。 - 循環(huán)設(shè)置狀態(tài): 使用
for
循環(huán)遍歷每個(gè)項(xiàng),獲取當(dāng)前項(xiàng)的句柄。 - 設(shè)置為可編輯狀態(tài): 使用
setFlags
方法將每個(gè)項(xiàng)的狀態(tài)設(shè)置為可編輯,包括可選擇、可編輯、可檢查、可啟用等狀態(tài)。
該槽函數(shù)的作用是將列表框中的所有項(xiàng)的狀態(tài)設(shè)置為可編輯,這樣用戶可以在運(yùn)行時(shí)修改這些項(xiàng)的文本內(nèi)容。
// 設(shè)置所有項(xiàng)設(shè)置為可編輯狀態(tài)
void MainWindow::on_pushButton_edit_clicked()
{int x,cnt;QListWidgetItem *aItem;// 獲取所有項(xiàng)數(shù)量cnt = ui->listWidget->count();for(x=0;x<cnt;x++){// 得到當(dāng)前選中項(xiàng)句柄aItem = ui->listWidget->item(x);// 設(shè)置狀態(tài)aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable|Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);}
}
運(yùn)行效果如下圖;
1.3 全選與反選
如下槽函數(shù) on_pushButton_selectall_clicked
的核心功能是實(shí)現(xiàn)一個(gè)全選按鈕,即將列表框中的所有項(xiàng)設(shè)置為選中狀態(tài)。
以下是概述:
- 獲取總數(shù): 使用
ui->listWidget->count()
獲取列表框中的項(xiàng)的總數(shù)。 - 循環(huán)設(shè)置選中狀態(tài): 使用
for
循環(huán)遍歷每個(gè)項(xiàng),獲取每個(gè)項(xiàng)的指針。 - 設(shè)置為選中狀態(tài): 使用
setCheckState
方法將每個(gè)項(xiàng)的狀態(tài)設(shè)置為選中狀態(tài),即勾選復(fù)選框。
該槽函數(shù)的作用是實(shí)現(xiàn)一個(gè)全選按鈕,方便用戶一次性選中所有列表框中的項(xiàng)。
void MainWindow::on_pushButton_selectall_clicked()
{// 獲取總數(shù)int cnt = ui->listWidget->count();for(int x=0;x<cnt;x++){// 獲取到項(xiàng)的指針QListWidgetItem *aItem = ui->listWidget->item(x);// 設(shè)置為選中aItem->setCheckState(Qt::Checked);}}
如下槽函數(shù) on_pushButton_noselect_clicked
的核心功能是實(shí)現(xiàn)一個(gè)全不選按鈕,即將列表框中的所有項(xiàng)設(shè)置為非選中狀態(tài)。
以下是概述:
- 獲取總數(shù): 使用
ui->listWidget->count()
獲取列表框中的項(xiàng)的總數(shù)。 - 循環(huán)設(shè)置非選中狀態(tài): 使用
for
循環(huán)遍歷每個(gè)項(xiàng),獲取每個(gè)項(xiàng)的指針。 - 設(shè)置為非選中狀態(tài): 使用
setCheckState
方法將每個(gè)項(xiàng)的狀態(tài)設(shè)置為非選中狀態(tài),即取消勾選復(fù)選框。
該槽函數(shù)的作用是實(shí)現(xiàn)一個(gè)全不選按鈕,方便用戶一次性取消選中列表框中的所有項(xiàng)。
void MainWindow::on_pushButton_noselect_clicked()
{// 獲取總數(shù)int cnt = ui->listWidget->count();for(int x=0;x<cnt;x++){// 獲取到一項(xiàng)指針QListWidgetItem *aItem = ui->listWidget->item(x);// 設(shè)置為非選中aItem->setCheckState(Qt::Unchecked);}
}
如下槽函數(shù) on_pushButton_deselect_clicked
的核心功能是實(shí)現(xiàn)一個(gè)反選按鈕,即將列表框中的每個(gè)項(xiàng)的選中狀態(tài)進(jìn)行反轉(zhuǎn)。
以下是概述:
- 獲取總數(shù): 使用
ui->listWidget->count()
獲取列表框中的項(xiàng)的總數(shù)。 - 循環(huán)設(shè)置反選狀態(tài): 使用
for
循環(huán)遍歷每個(gè)項(xiàng),獲取每個(gè)項(xiàng)的指針。 - 反選狀態(tài): 使用
checkState
方法獲取每個(gè)項(xiàng)的當(dāng)前選中狀態(tài),如果是選中狀態(tài) (Qt::Checked
),則設(shè)置為非選中狀態(tài) (Qt::Unchecked
),反之亦然。
該槽函數(shù)的作用是實(shí)現(xiàn)一個(gè)反選按鈕,方便用戶一次性反轉(zhuǎn)列表框中的所有項(xiàng)的選中狀態(tài)。
void MainWindow::on_pushButton_deselect_clicked()
{int x,cnt;QListWidgetItem *aItem;// 獲取總數(shù)cnt = ui->listWidget->count();for(x=0;x<cnt;x++){// 獲取到一項(xiàng)指針aItem = ui->listWidget->item(x);// 如果未選中則選中否則不選if(aItem->checkState() != Qt::Checked)aItem->setCheckState(Qt::Checked);elseaItem->setCheckState(Qt::Unchecked);}
}
運(yùn)行效果如下圖;
1.4 插入與追加
如下槽函數(shù) on_pushButton_add_clicked
的核心功能是實(shí)現(xiàn)一個(gè)“增加一項(xiàng)”按鈕,即在列表框的尾部追加一個(gè)新的項(xiàng)。
以下是概述:
- 創(chuàng)建圖標(biāo): 使用
QIcon
創(chuàng)建一個(gè)新的圖標(biāo),這里使用了名為 “2.ico” 的圖標(biāo)。 - 創(chuàng)建新的
QListWidgetItem
: 使用new QListWidgetItem("新增的項(xiàng)目")
創(chuàng)建一個(gè)新的QListWidgetItem
對象,設(shè)置了文本為 “新增的項(xiàng)目”。 - 設(shè)置圖標(biāo)和狀態(tài): 使用
setIcon
設(shè)置項(xiàng)的圖標(biāo),setCheckState
設(shè)置項(xiàng)的選中狀態(tài)為選中,setFlags
設(shè)置項(xiàng)的狀態(tài)為可選擇、可檢查、可啟用。 - 追加到控件: 使用
ui->listWidget->addItem(aItem)
將新創(chuàng)建的項(xiàng)追加到列表框的尾部。
該槽函數(shù)的作用是在列表框的尾部追加一個(gè)新的項(xiàng),該項(xiàng)包含指定的文本、圖標(biāo)以及初始的選中狀態(tài)。
void MainWindow::on_pushButton_add_clicked()
{QIcon aIcon;aIcon.addFile(":/image/2.ico");QListWidgetItem *aItem = new QListWidgetItem("新增的項(xiàng)目"); // 增加項(xiàng)目名aItem->setIcon(aIcon); // 設(shè)置圖標(biāo)aItem->setCheckState(Qt::Checked); // 設(shè)置為選中aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);ui->listWidget->addItem(aItem); // 增加到控件
}
如下槽函數(shù) on_pushButton_ins_clicked
的核心功能是實(shí)現(xiàn)一個(gè)“指定位置插入一項(xiàng)”按鈕,即在列表框的指定位置插入一個(gè)新的項(xiàng)。
以下是概述:
- 創(chuàng)建圖標(biāo): 使用
QIcon
創(chuàng)建一個(gè)新的圖標(biāo),這里使用了名為 “3.ico” 的圖標(biāo)。 - 創(chuàng)建新的
QListWidgetItem
: 使用new QListWidgetItem("插入的數(shù)據(jù)")
創(chuàng)建一個(gè)新的QListWidgetItem
對象,設(shè)置了文本為 “插入的數(shù)據(jù)”。 - 設(shè)置圖標(biāo)和狀態(tài): 使用
setIcon
設(shè)置項(xiàng)的圖標(biāo),setCheckState
設(shè)置項(xiàng)的選中狀態(tài)為選中,setFlags
設(shè)置項(xiàng)的狀態(tài)為可選擇、可檢查、可啟用。 - 在指定位置插入項(xiàng): 使用
ui->listWidget->insertItem(ui->listWidget->currentRow(), aItem)
在當(dāng)前行的上方插入一個(gè)新項(xiàng)。
該槽函數(shù)的作用是在列表框的指定位置插入一個(gè)新的項(xiàng),該項(xiàng)包含指定的文本、圖標(biāo)以及初始的選中狀態(tài)。
void MainWindow::on_pushButton_ins_clicked()
{QIcon aIcon;aIcon.addFile(":/image/3.ico");QListWidgetItem *aItem = new QListWidgetItem("插入的數(shù)據(jù)");aItem->setIcon(aIcon);aItem->setCheckState(Qt::Checked);aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);// 在當(dāng)前行的上方插入一個(gè)項(xiàng)ui->listWidget->insertItem(ui->listWidget->currentRow(),aItem);
}
運(yùn)行效果如下圖;
1.5 刪除列表一行
如下槽函數(shù) on_pushButton_delete_clicked
的核心功能是實(shí)現(xiàn)一個(gè)“刪除選中項(xiàng)”按鈕,即刪除列表框中當(dāng)前選中的項(xiàng)。
以下是概述:
- 獲取當(dāng)前行: 使用
ui->listWidget->currentRow()
獲取當(dāng)前選中項(xiàng)的行索引。 - 移除指定行的項(xiàng): 使用
ui->listWidget->takeItem(row)
移除指定行的項(xiàng),該方法返回被移除的項(xiàng)的指針,但不釋放空間。 - 釋放空間: 使用
delete aItem
釋放被移除項(xiàng)的空間,確保不發(fā)生內(nèi)存泄漏。
該槽函數(shù)的作用是刪除列表框中當(dāng)前選中的項(xiàng),同時(shí)釋放相應(yīng)的內(nèi)存空間。
void MainWindow::on_pushButton_delete_clicked()
{// 獲取當(dāng)前行int row = ui->listWidget->currentRow();// 移除指定行的項(xiàng),但不deleteQListWidgetItem *aItem = ui->listWidget->takeItem(row);// 釋放空間delete aItem;
}
運(yùn)行效果如下圖;
1.6 綁定右鍵菜單
在之前的內(nèi)容中我們展示了如何給MainWindow
主窗體增加右鍵菜單,本節(jié)我們將給ListWidget
增加右鍵菜單,當(dāng)用戶在ListWidget
組件中的任意一個(gè)子項(xiàng)下右鍵,則讓其彈出這個(gè)菜單,并根據(jù)選擇提供不同的功能。
首先我們繪制兩個(gè)UI
界面,并通過Tab
組件將其分離開,為了方便演示我們需要手動(dòng)增加列表項(xiàng)內(nèi)容,增加方法是在ListWidget
上面右鍵并選中編輯項(xiàng)目按鈕,此時(shí)就可以逐行向列表中錄入數(shù)據(jù)集。
為了增加菜單,我們首先需要在程序全局增加
QAction
其中每一個(gè)QAction
則代表一個(gè)菜單選項(xiàng)指針,由于我們計(jì)劃增加三個(gè)菜單選項(xiàng),則此處就保留三個(gè)全局菜單指針。
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <iostream>// 全局下設(shè)置增加刪除菜單
QAction *NewAction;
QAction *InsertAction;
QAction *DeleteAction;
首先以右鍵菜單演示為例,在MainWindow
主函數(shù)中,首先通過創(chuàng)建頂部菜單并將其設(shè)置為隱藏屬性,接著通過Connect
將每一個(gè)子菜單與Action
進(jìn)行連接,代碼如下所示;
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// ----------------------------------------------------// 繪制部分// ----------------------------------------------------// 使用 customContextMenuRequested 信號則需要設(shè)置ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);// 隱藏菜單欄上的右擊菜單this->setContextMenuPolicy(Qt::NoContextMenu);// 創(chuàng)建基礎(chǔ)頂部菜單QMenuBar *bar = menuBar();this->setMenuBar(bar);QMenu * fileMenu = bar->addMenu("菜單1");// 隱藏頂部菜單欄bar->setVisible(false);// 添加子菜單NewAction = fileMenu->addAction("增加IP地址");InsertAction = fileMenu->addAction("插入IP地址");DeleteAction = fileMenu->addAction("刪除IP地址");// 分別設(shè)置圖標(biāo)NewAction->setIcon(QIcon(":/image/1.ico"));InsertAction->setIcon(QIcon(":/image/2.ico"));DeleteAction->setIcon(QIcon(":/image/3.ico"));// ----------------------------------------------------// 綁定槽函數(shù)// ----------------------------------------------------connect(NewAction,&QAction::triggered,this,[=](){std::cout << "new action" << std::endl;});connect(InsertAction,&QAction::triggered,this,[=](){std::cout << "insert action" << std::endl;});// 以刪除為例,演示如何刪除選中行connect(DeleteAction,&QAction::triggered,this,[=](){int row = ui->listWidget->currentRow();QListWidgetItem *aItem = ui->listWidget->takeItem(row);delete aItem;std::cout << "delete action" << std::endl;});
}
接著,當(dāng)ListWidget
右鍵被點(diǎn)擊時(shí),則觸發(fā)on_listWidget_customContextMenuRequested
槽函數(shù),在該槽函數(shù)內(nèi)我們通過new QMenu
新建菜單,并通過addAction
屬性將其插入到被點(diǎn)擊位置上,其代碼如下所示;
// 當(dāng)listWidget被右鍵點(diǎn)擊時(shí)則觸發(fā)
void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
{std::cout << "x pos = "<< pos.x() << "y pos = " << pos.y() << std::endl;Q_UNUSED(pos);// 新建Menu菜單QMenu *ptr = new QMenu(this);// 添加Actions創(chuàng)建菜單項(xiàng)ptr->addAction(NewAction);ptr->addAction(InsertAction);// 添加一個(gè)分割線ptr->addSeparator();ptr->addAction(DeleteAction);// 在鼠標(biāo)光標(biāo)位置顯示右鍵快捷菜單ptr->exec(QCursor::pos());// 手工創(chuàng)建的指針必須手工刪除delete ptr;
}
運(yùn)行后讀者可自行在特定行上點(diǎn)擊右鍵,此時(shí)則會(huì)彈出菜單欄,如下圖所示;
接著來看下圖標(biāo)組的設(shè)置與綁定右鍵菜單的實(shí)現(xiàn)方式,第二種方式的綁定與第一種一致,唯一的區(qū)別僅僅只是顯示設(shè)置上的不同,如下是第二種方法的顯示配置代碼;
// 第二個(gè)ListWidget_使用圖標(biāo)方式展示
ui->listWidget_ico->setViewMode(QListView::IconMode);// 每一行是一個(gè)QListWidgetItem
QListWidgetItem *aItem;// 設(shè)置ICON的圖標(biāo)
QIcon aIcon;
aIcon.addFile(":/image/1.ico");ui->listWidget_ico->clear();
for(int x=0;x<10;x++)
{QString str = QString::asprintf("admin_%d",x);aItem = new QListWidgetItem(); // 新建一個(gè)項(xiàng)aItem->setText(str); // 設(shè)置文字標(biāo)簽aItem->setIcon(aIcon); // 設(shè)置圖標(biāo)//aItem->setCheckState(Qt::Checked); // 設(shè)為選中狀態(tài)aItem->setFlags(Qt::ItemIsSelectable | // 設(shè)置為不可編輯狀態(tài)Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);ui->listWidget_ico->addItem(aItem); // 增加項(xiàng)
}
使用時(shí)只需要按照相同的方式綁定菜單即可,運(yùn)行效果如下圖所示;