QListWidget 簡(jiǎn)介
QListWidget類提供了一個(gè)基于項(xiàng)目的列表小部件
QListWidget是一個(gè)方便的類,它提供了一個(gè)列表視圖,類似于QListView提供的列表視圖,但是具有一個(gè)用于添加和刪除項(xiàng)的經(jīng)典基于項(xiàng)的接口。QListWidget使用一個(gè)內(nèi)部模型來(lái)管理列表中的每個(gè)QListWidgetItem。要獲得更靈活的列表視圖小部件,請(qǐng)使用帶有標(biāo)準(zhǔn)模型的QListView類。列表小部件的構(gòu)造方法與其他小部件相同
設(shè)置多選還是單選
QListWidget selectionMode()確定可以同時(shí)選擇列表中的多少項(xiàng),以及是否可以創(chuàng)建復(fù)雜的項(xiàng)選擇。這可以使用setSelectionMode()函數(shù)設(shè)置
首先selectionMode()成員函數(shù)返回一個(gè)枚舉類型我們可以根據(jù)這個(gè)枚舉類型來(lái)判斷我們的listwidget是否支持多選
下面我們看一下 這個(gè)枚舉類型的原型
enum QAbstractItemView::SelectionMode
{
QAbstractItemView::SingleSelection = 1,
QAbstractItemView::ContiguousSelection = 4,
QAbstractItemView::ExtendedSelection = 3,
QAbstractItemView::MultiSelection = 2,
QAbstractItemView::NoSelection = 0
};
QAbstractItemView::SingleSelection表示 當(dāng)用戶選擇一個(gè)項(xiàng)目時(shí),任何已經(jīng)選擇的項(xiàng)目都將變?yōu)槲催x擇。用戶可以取消選定的項(xiàng)。
QAbstractItemView::ContiguousSelection 當(dāng)用戶以通常的方式選擇一個(gè)項(xiàng)目時(shí),將清除該選擇并選擇新項(xiàng)目。但是,如果用戶在單擊項(xiàng)時(shí)按下Shift鍵,則根據(jù)所單擊項(xiàng)的狀態(tài),選擇或取消當(dāng)前項(xiàng)和所單擊項(xiàng)之間的所有項(xiàng)。
QAbstractItemView::ExtendedSelection 當(dāng)用戶以通常的方式選擇一個(gè)項(xiàng)目時(shí),將清除該選擇并選擇新項(xiàng)目。但是,如果用戶在單擊一個(gè)項(xiàng)目時(shí)按下Ctrl鍵,則單擊的項(xiàng)目將被切換,所有其他項(xiàng)目將保持不變。如果用戶在單擊項(xiàng)時(shí)按下Shift鍵,則根據(jù)所單擊項(xiàng)的狀態(tài)選擇或不選擇當(dāng)前項(xiàng)和所單擊項(xiàng)之間的所有項(xiàng)??梢酝ㄟ^(guò)拖動(dòng)鼠標(biāo)來(lái)選擇多個(gè)項(xiàng)目。
QAbstractItemView::MultiSelection 當(dāng)用戶以通常的方式選擇一個(gè)項(xiàng)目時(shí),該項(xiàng)目的選擇狀態(tài)將被切換,其他項(xiàng)目將保持不變。多個(gè)項(xiàng)目可以通過(guò)拖動(dòng)鼠標(biāo)來(lái)切換。
QAbstractItemView::NoSelection 無(wú)法選擇項(xiàng)。
添加Items
向列表添加項(xiàng)有兩種方法:可以使用列表小部件作為父小部件構(gòu)造它們,或者不使用父小部件構(gòu)造它們,然后將它們添加到列表中。如果在構(gòu)建項(xiàng)目時(shí)列表小部件已經(jīng)存在,那么第一個(gè)方法更容易使用:
/*第一種 創(chuàng)建的時(shí)候設(shè)置父類的*/
new QListWidgetItem(tr("Oak"), listWidget);
new QListWidgetItem(tr("Fir"), listWidget);
new QListWidgetItem(tr("Pine"), listWidget);
/*第二種直接用ListWidget的成員函數(shù)添加*/
QListWidgetItem *newItem = new QListWidgetItem;
newItem->setText(itemText);
listWidget->insertItem(row, newItem);
對(duì)于多個(gè)項(xiàng)目,可以使用insertItems()。列表中的項(xiàng)數(shù)可以通過(guò)count()函數(shù)找到。要從列表中刪除項(xiàng),請(qǐng)使用takeItem()。列表中的當(dāng)前項(xiàng)可以用currentItem()找到,也可以用setCurrentItem()更改。用戶還可以通過(guò)使用鍵盤導(dǎo)航或單擊其他項(xiàng)來(lái)更改當(dāng)前項(xiàng)。當(dāng)當(dāng)前項(xiàng)更改時(shí),currentItemChanged()信號(hào)將與新的當(dāng)前項(xiàng)和先前的當(dāng)前項(xiàng)一起發(fā)出。
實(shí)戰(zhàn)代碼
前面講了那么多我們也大致了解怎么去使用這個(gè)控件了 那么下面我就實(shí)際操作寫一個(gè)ListWidget控件的例子
1.Qt Creator 創(chuàng)建一個(gè)帶UI的項(xiàng)目

2、添加如下代碼分別用兩種方式插入我們需要插入的項(xiàng)
#include "MainWindow.h"
#include "ui_mainwindow.h"
#include <QListWidget>
#include <QListWidgetItem>
#include <QString>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
/*
使用listwidget
*/
InitListItem();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::InitListItem()
{
/*先用第一種方式初始化*/
for(int i = 0 ; i<10; i++)
{
QString str = QString("Item %1").arg(i);
qDebug() << str << endl;
new QListWidgetItem(str,ui->listWidget);
}
/*第二種初始化方式*/
for (int l = 10;l<20;l++)
{
QString str = QString("2item %1").arg(l);
QListWidgetItem* iTems = new QListWidgetItem(str);
ui->listWidget->addItem(iTems);
}
}
效果圖就像這樣

3、下面我們來(lái)深入研究下QListWidget這個(gè)控件
QListWidget 的成員函數(shù)
count此屬性保存列表中包含任何隱藏項(xiàng)的項(xiàng)數(shù)。currentRow獲取當(dāng)前選擇的行 setCurrentRow(int row) 是設(shè)置選中行QListWidget 有如下信號(hào)
void
currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
void
currentRowChanged(int currentRow)
void
currentTextChanged(const QString ¤tText)
void
itemActivated(QListWidgetItem *item)
void
itemChanged(QListWidgetItem *item)
void
itemClicked(QListWidgetItem *item)
void
itemDoubleClicked(QListWidgetItem *item)
void
itemEntered(QListWidgetItem *item)
void
itemPressed(QListWidgetItem *item)
void
itemSelectionChanged()
一般情況我們使用無(wú)非就是像知道用戶選中某一行或者某一行被選中我們需要處理什么
下面我直接用簡(jiǎn)單的代碼實(shí)現(xiàn)下
首先我們定義一個(gè) 來(lái)處理 QListWidget::currentRowChanged信號(hào)的 的槽函數(shù)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
public:
/*
先定一個(gè)初始化的函數(shù)
*/
void InitListItem();
public slots:
/*新建一個(gè)當(dāng)用戶選中的項(xiàng)發(fā)送改變時(shí)的槽函數(shù)*/
void CurrentChanged(int CurrentRow);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
然后實(shí)現(xiàn)的代碼如下
#include "MainWindow.h"
#include "ui_mainwindow.h"
#include <QListWidget>
#include <QListWidgetItem>
#include <QString>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
/*
使用listwidget
*/
InitListItem();
/*用connect 連接信號(hào)和槽函數(shù)*/
QObject::connect(ui->listWidget,&QListWidget::currentRowChanged,this,&MainWindow::CurrentChanged);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::InitListItem()
{
/*先用第一種方式初始化*/
for(int i = 0 ; i<10; i++)
{
QString str = QString("Item %1").arg(i);
qDebug() << str << endl;
new QListWidgetItem(str,ui->listWidget);
}
/*第二種初始化方式*/
for (int l = 10;l<20;l++)
{
QString str = QString("2item %1").arg(l);
QListWidgetItem* iTems = new QListWidgetItem(str);
ui->listWidget->addItem(iTems);
}
}
void MainWindow::CurrentChanged(int CurrentRow)
{
//我們也不做過(guò)多的操作我們可以獲取打印出當(dāng)前選中的項(xiàng)目的文本數(shù)據(jù)
if(CurrentRow!=-1)
{
QListWidgetItem* item = ui->listWidget->item(CurrentRow);
qDebug() << "Are you currently selected :" << item->text();
}
}
當(dāng)然最后的效果如下圖

如果需要研究QListWidget 的其他用法可以參考QT的幫助手冊(cè)
今天的和我一起學(xué)QT就先介紹到這里