QListWidget 简介
QListWidget类提供了一个基于项目的列表小部件
QListWidget是一个方便的类,它提供了一个列表视图,类似于QListView提供的列表视图,但是具有一个用于添加和删除项的经典基于项的接口。QListWidget使用一个内部模型来管理列表中的每个QListWidgetItem。要获得更灵活的列表视图小部件,请使用带有标准模型的QListView类。列表小部件的构造方法与其他小部件相同
设置多选还是单选
QListWidget selectionMode()
确定可以同时选择列表中的多少项,以及是否可以创建复杂的项选择。这可以使用setSelectionMode()
函数设置
首先selectionMode()
成员函数返回一个枚举类型我们可以根据这个枚举类型来判断我们的listwidget是否支持多选
下面我们看一下 这个枚举类型的原型
enum QAbstractItemView::SelectionMode
{
QAbstractItemView::SingleSelection = 1,
QAbstractItemView::ContiguousSelection = 4,
QAbstractItemView::ExtendedSelection = 3,
QAbstractItemView::MultiSelection = 2,
QAbstractItemView::NoSelection = 0
};
QAbstractItemView::SingleSelection
表示 当用户选择一个项目时,任何已经选择的项目都将变为未选择。用户可以取消选定的项。
QAbstractItemView::ContiguousSelection
当用户以通常的方式选择一个项目时,将清除该选择并选择新项目。但是,如果用户在单击项时按下Shift键,则根据所单击项的状态,选择或取消当前项和所单击项之间的所有项。
QAbstractItemView::ExtendedSelection
当用户以通常的方式选择一个项目时,将清除该选择并选择新项目。但是,如果用户在单击一个项目时按下Ctrl键,则单击的项目将被切换,所有其他项目将保持不变。如果用户在单击项时按下Shift键,则根据所单击项的状态选择或不选择当前项和所单击项之间的所有项。可以通过拖动鼠标来选择多个项目。
QAbstractItemView::MultiSelection
当用户以通常的方式选择一个项目时,该项目的选择状态将被切换,其他项目将保持不变。多个项目可以通过拖动鼠标来切换。
QAbstractItemView::NoSelection
无法选择项。
添加Items
向列表添加项有两种方法:可以使用列表小部件作为父小部件构造它们,或者不使用父小部件构造它们,然后将它们添加到列表中。如果在构建项目时列表小部件已经存在,那么第一个方法更容易使用:
/*第一种 创建的时候设置父类的*/
new QListWidgetItem(tr("Oak"), listWidget);
new QListWidgetItem(tr("Fir"), listWidget);
new QListWidgetItem(tr("Pine"), listWidget);
/*第二种直接用ListWidget的成员函数添加*/
QListWidgetItem *newItem = new QListWidgetItem;
newItem->setText(itemText);
listWidget->insertItem(row, newItem);
对于多个项目,可以使用insertItems()。列表中的项数可以通过count()函数找到。要从列表中删除项,请使用takeItem()。列表中的当前项可以用currentItem()找到,也可以用setCurrentItem()更改。用户还可以通过使用键盘导航或单击其他项来更改当前项。当当前项更改时,currentItemChanged()信号将与新的当前项和先前的当前项一起发出。 ## 实战代码 前面讲了那么多我们也大致了解怎么去使用这个控件了 那么下面我就实际操作写一个ListWidget控件的例子
1.Qt Creator 创建一个带UI的项目 ![image](https://i.loli.net/2019/04/08/5caab136a3ae8.png) 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);
}
}
效果图就像这样 ![效果](https://i.loli.net/2019/04/08/5caad2a7788dd.png)
3、下面我们来深入研究下QListWidget这个控件
QListWidget 的成员函数 `count`此属性保存列表中包含任何隐藏项的项数。 `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()
一般情况我们使用无非就是像知道用户选中某一行或者某一行被选中我们需要处理什么
下面我直接用简单的代码实现下
首先我们定义一个 来处理 QListWidget::currentRowChanged
信号的 的槽函数
#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:
/*
先定一个初始化的函数
*/
void InitListItem();
public slots:
/*新建一个当用户选中的项发送改变时的槽函数*/
void CurrentChanged(int CurrentRow);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
然后实现的代码如下
#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 连接信号和槽函数*/
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)
{
//我们也不做过多的操作我们可以获取打印出当前选中的项目的文本数据
if(CurrentRow!=-1)
{
QListWidgetItem* item = ui->listWidget->item(CurrentRow);
qDebug() << "Are you currently selected :" << item->text();
}
}
当然最后的效果如下图
如果需要研究QListWidget 的其他用法可以参考QT的帮助手册
今天的和我一起学QT就先介绍到这里