添加条目
// 在尾部添加
void addItem(const QString &label)
void addItem(QListWidgetItem *item)
void addItems(const QStringList &labels)
// 在指定行之前添加
void insertItem(int row, QListWidgetItem *item)
void insertItem(int row, const QString &label)
void insertItems(int row, const QStringList &labels)
还可以在QListWidgetItem的构造函数直接指定parent为列表控件,这个item就会自动加入到列表中
QListWidgetItem::QListWidgetItem(const QIcon &icon,
const QString &text,
QListWidget *parent = nullptr,
int type = Type)
比如:
QListWidget * lw = new QListWidget(this);
//方法1:addItems
lw -> addItems({"1号","2号","3号"});
//方法2:addItem
QListWidgetItem * item4 = new QListWidgetItem(QIcon(":/11.png"), "4号");
lw -> addItem(item4);
//方法3:直接指定parent,可以直接添加进去
QListWidgetItem * item5 = new QListWidgetItem(lw);
item5 -> setText("5号");
//方法4:insert
//头插insertItem(0,"6号"),参数1为0
//尾插insertItem(lw->count(),"6号"),参数1为列表控件的count()
lw -> insertItem(lw -> count(), "6号");
遍历列表
通过count()方法获取数量,通过item(int row)方法获取对应行的item
//遍历列表
for (int i = 0; i < lw -> count(); ++i) {
//item方法获取具体的条目
qDebug() << lw -> item(i) -> text();
}
删除条目
列表中的条目可以删除,以删除当前行为例
removeItemWidget和takeItem都是取消掉列表控件对条目的管理,并没有真正删除
但是后面还是需要手动delete掉item;
// 方法一
QListWidgetItem* item = ui->lwProvince->currentItem();
ui->lwProvince->removeItemWidget(item);
delete item;
// 方法二
int row = ui->lwProvince->currentRow();
QListWidgetItem* item = ui->lwProvince->takeItem(row);
delete item;
设置可编辑
设置后列表里的条目就可以被编辑了
void setEditTriggers(QAbstractItemView::EditTriggers triggers)
triggers有以下几个取值:
通常设置为DoubleClicked双击条目进行编辑
或者AllEditTriggers,上面所有方式都可以触发编辑
除此之外,列表里面的每一个条目还要设置flags,将其设置为可编辑,这样里面的条目才可以编辑
//列表控件设为置可编辑
lw -> setEditTriggers(QAbstractItemView::DoubleClicked);
//遍历所有条目,设置条目的flags为可编辑,可选择,使能
for (int i = 0; i < lw -> count(); ++i) {
lw -> item(i) -> setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
}
设置排序
void QListWidget::sortItems(Qt::SortOrder order = Qt::AscendingOrder)
可以对条目进行排序:升序或降序
设置选择模式
即设置多选和单选
void setSelectionMode(QAbstractItemView::SelectionMode mode)
mode有以下几个取值:
通常设置为ExtendedSelection:可以按住ctrl多选和按住shift范围选
设置每一行的宽高
void setGridSize(const QSize &size)
设置条目图标的宽高
void setIconSize(const QSize &size)
设置Flow
void setFlow(QListView::Flow flow)
flow有以下取值:
从左到右:
从上到下:(通常设置为从上到下)
显示其他QWidget
void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)
先添加item或者获取到已有的item,然后将对应的其他控件设置进去
QSpinBox* sp=new QSpinBox(this);
QListWidgetItem* item8=new QListWidgetItem(lw);
lw->setItemWidget(item8,sp);
显示模式
有两种显示模式,列表模式和图标模式
// 获取和设置显示模式
QListView::ViewMode viewMode() const
void setViewMode(QListView::ViewMode mode)
QListView::ViewMode有两个取值
QListView::ListMode
列表模式
QListView::IconMode
图标模式
交替背景色
设置相邻行交替显示不同的背景色,便于显示和浏览时定位
// 获取和设置交替显示
bool alternatingRowColors() const
void setAlternatingRowColors(bool enable)
常用信号
currentItemChanged(QListWidgetItem * current, QListWidgetItem * previous)//槽函数中需要判断previous有可能为nullptr
currentRowChanged
currentTextChanged //前面3个差不多 都是当前项改变 只不过信号的参数有区别
itemActivated //激活: 在不可编辑模式下, 左键双击条目可触发该信号
itemChanged //条目内容改变: 比如手动编辑完成 代码改变可触发该信号
itemDoubleClicked //鼠标左键或者右键双击条目都会激发
itemEntered //鼠标移动到某个条目上面会触发 QListWidget需要打开鼠标追踪
itemPressed //鼠标左右键在某个条目按下会触发
itemClicked //在不可编辑模式下鼠标左键单击条目会触发
itemSelectionChanged //单选或多选模式下: 选择的条目发生改变会触发
举例
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QPushButton>
#include<QListWidget>
#include<QVBoxLayout>
#include<QHBoxLayout>
#include<QMessageBox>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr): QWidget(parent)
{
resize(200,200);
QVBoxLayout* v_box=new QVBoxLayout(this);
v_box->setSpacing(20);
//创建列表
list=new QListWidget(this);
//添加一条初始条目
QListWidgetItem* item1=new QListWidgetItem(QIcon(":/11.png"),"湖北");
list->addItem(item1);
v_box->addWidget(list);
QHBoxLayout* h_box=new QHBoxLayout();
h_box->setSpacing(20);
//创建按钮
add=new QPushButton("添加一行",this);
del=new QPushButton("删除选中行",this);
change_mod=new QPushButton("改变显示模式",this);
h_box->addWidget(add);
h_box->addWidget(del);
h_box->addWidget(change_mod);
v_box->addLayout(h_box);
//绑定槽函数
//添加
connect(add,&QPushButton::clicked,this,[=](){
//直接在尾部添加
QListWidgetItem* item1=new QListWidgetItem(QIcon(":/11.png"),"浙江");
list->addItem(item1);
});
//删除
connect(del,&QPushButton::clicked,this,[=](){
//删除当前选中的行
QListWidgetItem* item=list->currentItem();
list->removeItemWidget(item);
delete item;//记手动delete
// //如何遍历list里面控件的条目
// for(int i=0;i<list->count();++i)
// {
// 获取条目的个数,然后根据索引获取条目
// auto item=list->takeItem(i);
// }
});
//改变显示模式
connect(change_mod,&QPushButton::clicked,this,[=](){
//设为列表或者图标模式
if(list->viewMode()==QListWidget::ListMode)
{
list->setViewMode(QListWidget::IconMode);
}
else if(list->viewMode()==QListWidget::IconMode)
{
list->setViewMode(QListWidget::ListMode);
}
});
//绑定QListWidget控件的信号
connect(list,&QListWidget::itemClicked,this,[=](){
//将选中条目的文本提示下
auto item=list->currentItem();//该接口获取当前选条目
QMessageBox::information(this,"",QStringLiteral("当前选中:")+item->text());
});
}
~Widget()=default;
private:
QPushButton* add;
QPushButton* del;
QPushButton* change_mod;
QListWidget* list;
};
#endif // WIDGET_H
学习链接:https://github.com/0voice