列表控件QListWidget

添加条目

// 在尾部添加
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();
}

删除条目

列表中的条目可以删除,以删除当前行为例

removeItemWidgettakeItem都是取消掉列表控件对条目的管理,并没有真正删除

但是后面还是需要手动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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值