C/C++中使用列表框組件Qt?ListWidget
ListWidget列表框組件,該組件與TreeWidget有些相似,區(qū)別在于TreeWidget可以實現(xiàn)嵌套以及多字段結(jié)構(gòu),而ListWidget組件則只能實現(xiàn)單字段結(jié)構(gòu),ListWidget組件常用于顯示單條記錄,例如只顯示IP地址,用戶名等數(shù)據(jù),如下筆記是本人在開發(fā)中經(jīng)常用到的一些基本操作技巧,包括列表框組件的基本操作方法。
常用節(jié)點(diǎn)間的操作方法如下:
- ListView 組件與應(yīng)用基礎(chǔ)
- ListWidget 初始化
- ListWidget 變化行(觸發(fā)事件)
- ListWidget 編輯狀態(tài)設(shè)置
- ListWidget 全選/全不選
- ListWidget 反選(對錯交織)
- ListWidget 指定位置插入 / 增加一項
- ListWidget 刪除選中項
ListView 組件與應(yīng)用基礎(chǔ):
該組件與ListWidget功能一致,只是ListView無法實現(xiàn)編輯只能預(yù)覽。
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QListView> #include <QStandardItem> #include <QStringListModel> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } // 初始化View組件 向ListView組件中填充數(shù)據(jù) // By:LyShark // https://www.cnblogs.com/lyshark void MainWindow::on_pushButton_clicked() { QStringList data; QStringListModel *model; // 追加數(shù)據(jù)到ListView中 data << QString("192.168.1.1"); data << QString("192.168.1.2"); data << QString("192.168.1.3"); data << QString("192.168.1.4"); model = new QStringListModel(data); ui->listView->setModel(model); // 移除第1個地址 data.removeAt(0); // 再次刷新ListView model = new QStringListModel(data); ui->listView->setModel(model); } // 實現(xiàn)間隔初始化,每一行一種顏色 void MainWindow::on_pushButton_2_clicked() { QStringList data; QStandardItemModel *model = new QStandardItemModel(); // 清空記錄 model->removeRows(0,model->rowCount()); // 追加數(shù)據(jù)到ListView中 data << QString("192.168.1.1"); // 循環(huán)追加 for(int x=2; x<5; x++) { data << QString("192.168.1.%0").arg(x); } // 輸出到ListView記錄 int nCount = data.size(); for(int x=0; x<nCount; x++) { QString string = static_cast<QString>(data.at((x))); // 強(qiáng)轉(zhuǎn)為QString類型 QStandardItem *item = new QStandardItem(string); if(x%2 == 0) { // 設(shè)置色彩 QLinearGradient linear_grad(QPointF(0,0),QPointF(200,200)); linear_grad.setColorAt(0,Qt::darkGreen); QBrush brush(linear_grad); item->setBackground(brush); } // 追加到mode模型 model->appendRow(item); } // 設(shè)置模型 ui->listView->setModel(model); //ui->listView->setFixedSize(200,300); }
代碼運(yùn)行效果如下:
上方代碼中我們多數(shù)都是在使用View視圖組件,接下來將具體分析Widget組件的使用細(xì)節(jié),View組件與Widget組件看似一致,但卻存在本質(zhì)區(qū)別,其大致區(qū)別如下:
- Widget 組件可以直接通過如AddItem等一系列函數(shù)操作特定數(shù)據(jù)集,該組件還具有直接編輯的能力。
- View 組件是基于Model模型映射工作的,每次操作數(shù)據(jù)時都需要借助QAbstractListModel數(shù)據(jù)模型來操作。
簡單來說View組件適合于瀏覽展示數(shù)據(jù)較多的場景,因為其綁定了鏈表結(jié)構(gòu)從而在數(shù)據(jù)的展示上更為靈活,而Widget組件更適合于更新或修改數(shù)據(jù)較多的使用場景。
ListWidget 節(jié)點(diǎn)初始化:
節(jié)點(diǎn)的初始化就是向widget組件內(nèi)插入一個QListWidgetItem類。
// 初始化列表 listWidget // By: LyShark void MainWindow::on_pushButton_clicked() { // 每一行是一個QListWidgetItem QListWidgetItem *aItem; // 設(shè)置ICON的圖標(biāo) QIcon aIcon; aIcon.addFile(":/image/1.ico"); ui->listWidget->clear(); for(int x=0;x<10;x++) { QString str = QString::asprintf("192.168.1.%d",x); 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); ui->listWidget->addItem(aItem); //增加項 } }
代碼運(yùn)行效果如下:
ListWidget 行內(nèi)文本變化:
當(dāng)我們點(diǎn)擊行內(nèi)任意一個列表選項時,我們讓其觸發(fā)currentItemChanged并將變化行更新到窗體上。
// listWidget 當(dāng)前選中項發(fā)生變化 // By: LyShark void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { QString str; if (current != NULL) //需要檢測變量指針是否為空 { if (previous==NULL) //需要檢測變量指針是否為空 { str="當(dāng)前:"+current->text(); this->setWindowTitle(QString(current->text())); } else { str="前一項:" + previous->text() + "; 當(dāng)前項:" + current->text(); std::cout << str.toStdString().data() << std::endl; this->setWindowTitle(QString(current->text())); } } }
代碼運(yùn)行效果如下:
ListWidget 編輯狀態(tài)設(shè)置:
默認(rèn)情況下ListWidget組件內(nèi)所有文件是不可編輯的,我們也可以將編輯屬性打開。
// 設(shè)置所有項設(shè)置為可編輯狀態(tài) // https://www.cnblogs.com/lyshark void MainWindow::on_pushButton_5_clicked() { int x,cnt; QListWidgetItem *aItem; cnt = ui->listWidget->count(); for(x=0;x<cnt;x++) { aItem = ui->listWidget->item(x); aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled); } }
代碼運(yùn)行效果如下:
ListWidget 全選/全不選:
全選顧名思義就是選中菜單中的所有數(shù)據(jù),使用aItem->setCheckState(Qt::Checked)實現(xiàn)選中,通過循環(huán)計數(shù)即可。
// 全選按鈕 // https://www.cnblogs.com/lyshark void MainWindow::on_pushButton_2_clicked() { int cnt = ui->listWidget->count(); // 獲取總數(shù) for(int x=0;x<cnt;x++) { QListWidgetItem *aItem = ui->listWidget->item(x); // 獲取到一項指針 aItem->setCheckState(Qt::Checked); // 設(shè)置為選中 } } // 全不選 // By: LyShark void MainWindow::on_pushButton_3_clicked() { int cnt = ui->listWidget->count(); // 獲取總數(shù) for(int x=0;x<cnt;x++) { QListWidgetItem *aItem = ui->listWidget->item(x); // 獲取到一項指針 aItem->setCheckState(Qt::Unchecked); // 設(shè)置為非選中 } }
代碼運(yùn)行效果如下:
ListWidget 反選功能:
反選的含義是,用戶選中菜單反選后會變?yōu)槲催x中狀態(tài),未選中則變?yōu)檫x中,只需要增加一個判斷即可實現(xiàn)。
// By: LyShark void MainWindow::on_pushButton_4_clicked() { int x,cnt; QListWidgetItem *aItem; cnt = ui->listWidget->count(); for(x=0;x<cnt;x++) { aItem = ui->listWidget->item(x); if(aItem->checkState() != Qt::Checked) aItem->setCheckState(Qt::Checked); else aItem->setCheckState(Qt::Unchecked); } }
代碼運(yùn)行效果如下:
ListWidget 指定位置插入/追加插入:
在選中行的上方插入一行新的表項,以及追加到末尾一行。
// 指定位置插入一項 // www.cnblogs.com/lyshark void MainWindow::on_pushButton_8_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)前行的上方插入一個項 ui->listWidget->insertItem(ui->listWidget->currentRow(),aItem); } // 增加一項,尾部追加 void MainWindow::on_pushButton_7_clicked() { QIcon aIcon; aIcon.addFile(":/image/2.ico"); QListWidgetItem *aItem = new QListWidgetItem("新增的項目"); // 增加項目名 aItem->setIcon(aIcon); // 設(shè)置圖標(biāo) aItem->setCheckState(Qt::Checked); // 設(shè)置為選中 aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled); ui->listWidget->addItem(aItem); // 增加到控件 }
代碼運(yùn)行效果如下:
ListWidget 刪除選中項:
刪除當(dāng)前選中的一項,并清理釋放內(nèi)存。
// 刪除選中項 void MainWindow::on_pushButton_6_clicked() { int row = ui->listWidget->currentRow(); // 獲取當(dāng)前行 QListWidgetItem *aItem = ui->listWidget->takeItem(row); // 移除指定行的項,但不delete delete aItem; // 釋放空間 }
代碼運(yùn)行效果如下:
文章出處:https://www.cnblogs.com/lyshark
到此這篇關(guān)于C/C++中使用列表框組件Qt ListWidget的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++中的類型轉(zhuǎn)換static_cast、dynamic_cast、const_cast和reinterpret_cas
這篇文章主要介紹了C++中的類型轉(zhuǎn)換static_cast、dynamic_cast、const_cast和reinterpret_cast總結(jié),需要的朋友可以參考下2014-10-10C++數(shù)據(jù)精度問題(對浮點(diǎn)數(shù)保存指定位小數(shù))
這篇文章主要介紹了對浮點(diǎn)數(shù)保存指定位小數(shù)。比如, 1.123456. 要保存1位小數(shù),,調(diào)用方法后, 保存的結(jié)果為: 1.1。 再比如,1.98765, 保存2位小數(shù)的結(jié)果為: 2.00,需要的朋友可以參考下2017-08-08