QListWidget 簡介
QListWidget類提供了一個基于項目的列表小部件
QListWidget是一個方便的類嘀韧,它提供了一個列表視圖,類似于QListView提供的列表視圖酗洒,但是具有一個用于添加和刪除項的經(jīng)典基于項的接口。QListWidget使用一個內(nèi)部模型來管理列表中的每個QListWidgetItem裁眯。要獲得更靈活的列表視圖小部件啤咽,請使用帶有標準模型的QListView類。列表小部件的構造方法與其他小部件相同
設置多選還是單選
QListWidget selectionMode()
確定可以同時選擇列表中的多少項廓奕,以及是否可以創(chuàng)建復雜的項選擇抱婉。這可以使用setSelectionMode()
函數(shù)設置
首先selectionMode()
成員函數(shù)返回一個枚舉類型我們可以根據(jù)這個枚舉類型來判斷我們的listwidget是否支持多選
下面我們看一下 這個枚舉類型的原型
enum QAbstractItemView::SelectionMode
{
QAbstractItemView::SingleSelection = 1,
QAbstractItemView::ContiguousSelection = 4,
QAbstractItemView::ExtendedSelection = 3,
QAbstractItemView::MultiSelection = 2,
QAbstractItemView::NoSelection = 0
};
QAbstractItemView::SingleSelection
表示 當用戶選擇一個項目時,任何已經(jīng)選擇的項目都將變?yōu)槲催x擇桌粉。用戶可以取消選定的項蒸绩。
QAbstractItemView::ContiguousSelection
當用戶以通常的方式選擇一個項目時,將清除該選擇并選擇新項目铃肯。但是患亿,如果用戶在單擊項時按下Shift鍵,則根據(jù)所單擊項的狀態(tài)押逼,選擇或取消當前項和所單擊項之間的所有項步藕。
QAbstractItemView::ExtendedSelection
當用戶以通常的方式選擇一個項目時,將清除該選擇并選擇新項目宴胧。但是,如果用戶在單擊一個項目時按下Ctrl鍵表锻,則單擊的項目將被切換恕齐,所有其他項目將保持不變。如果用戶在單擊項時按下Shift鍵瞬逊,則根據(jù)所單擊項的狀態(tài)選擇或不選擇當前項和所單擊項之間的所有項显歧。可以通過拖動鼠標來選擇多個項目确镊。
QAbstractItemView::MultiSelection
當用戶以通常的方式選擇一個項目時士骤,該項目的選擇狀態(tài)將被切換,其他項目將保持不變蕾域。多個項目可以通過拖動鼠標來切換拷肌。
QAbstractItemView::NoSelection
無法選擇項到旦。
添加Items
向列表添加項有兩種方法:可以使用列表小部件作為父小部件構造它們,或者不使用父小部件構造它們巨缘,然后將它們添加到列表中添忘。如果在構建項目時列表小部件已經(jīng)存在,那么第一個方法更容易使用:
/*第一種 創(chuàng)建的時候設置父類的*/
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);
對于多個項目若锁,可以使用insertItems()搁骑。列表中的項數(shù)可以通過count()函數(shù)找到。要從列表中刪除項又固,請使用takeItem()仲器。列表中的當前項可以用currentItem()找到,也可以用setCurrentItem()更改仰冠。用戶還可以通過使用鍵盤導航或單擊其他項來更改當前項乏冀。當當前項更改時,currentItemChanged()信號將與新的當前項和先前的當前項一起發(fā)出沪停。
實戰(zhàn)代碼
前面講了那么多我們也大致了解怎么去使用這個控件了 那么下面我就實際操作寫一個ListWidget控件的例子
1.Qt Creator 創(chuàng)建一個帶UI的項目
2煤辨、添加如下代碼分別用兩種方式插入我們需要插入的項
#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、下面我們來深入研究下QListWidget這個控件
QListWidget 的成員函數(shù)
count
此屬性保存列表中包含任何隱藏項的項數(shù)木张。currentRow
獲取當前選擇的行 setCurrentRow(int row)
是設置選中行QListWidget 有如下信號
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()
一般情況我們使用無非就是像知道用戶選中某一行或者某一行被選中我們需要處理什么
下面我直接用簡單的代碼實現(xiàn)下
首先我們定義一個 來處理 QListWidget::currentRowChanged
信號的 的槽函數(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:
/*
先定一個初始化的函數(shù)
*/
void InitListItem();
public slots:
/*新建一個當用戶選中的項發(fā)送改變時的槽函數(shù)*/
void CurrentChanged(int CurrentRow);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
然后實現(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 連接信號和槽函數(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)
{
//我們也不做過多的操作我們可以獲取打印出當前選中的項目的文本數(shù)據(jù)
if(CurrentRow!=-1)
{
QListWidgetItem* item = ui->listWidget->item(CurrentRow);
qDebug() << "Are you currently selected :" << item->text();
}
}
當然最后的效果如下圖
如果需要研究QListWidget 的其他用法可以參考QT的幫助手冊
今天的和我一起學QT就先介紹到這里