QT的视图类(QTableView和QListView)(二)

QListView

开发工具:QT Creator

QListView 是 Qt 中用于显示列表数据的视图控件。它继承自 QAbstractItemView,通常与模型(如 QStringListModelQStandardItemModel 或自定义模型)配合使用,用于呈现数据项的列表。

1、QListView和QStringListModel配合使用

// 创建数据list
QStringList list = {"item1", "item2", "item3"};

// 创建model, 并绑定list数据
QStringListModel *model = new QStringListModel(list);

// 给listView设置model
ui->listView->setModel(model);

创建的model也要注意声明周期,见QT的视图类(QTableView和QListView)(一)-优快云博客

QListView的QStringListModel增删数据其实就是对QStringList进行操作。

// 添加数据

// 通过model获取原有的数据list
QStringList updatelist = model->stringList();

// 往原有的数据list中添加数据
updatelist << "item4" << "item5";

// 给model设置更新后的list
model->setStringList(updatelist);

// 更新listView
ui->listView->update();


// 通过model获取原有的数据list
QStringList updatelist2 = model->stringList();

// 删除数据
updatelist2.takeFirst();

// 给model设置更新后的list
model->setStringList(updatelist2);

// 更新listView
ui->listView->update();

如果需要获取点击的是哪一个数据,可以使用点击事件

void onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected

void onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected) {
        QModelIndexList indexes = selected.indexes();
        if (!indexes.isEmpty()) {
            QModelIndex index = indexes.first();
            qDebug() << "Selected item:" << index.data().toString();
        }
    }

2、QListView和QStandardItemModel配合使用

使用步骤和QStringListModel一样,简单的使用方式不做多余的介绍了。

QStandardItemModel *model = new QStandardItemModel();
model->setColumnCount(3);
model->setHorizontalHeaderLabels({"Name", "Age", "City"});

QStandardItem *item1 = new QStandardItem("Alice");
QStandardItem *item2 = new QStandardItem("25");
QStandardItem *item3 = new QStandardItem("New York");
model->appendRow({item1, item2, item3});

// 创建 QTableView 来显示模型
QTableView *view = new QTableView();
view->setModel(model);

很多时候列表数据需要的不仅仅数数据,也可能需要按钮、图片、点击等功能,下面提供一个添加了按钮以及按钮事件的例子。

// listviewshow.h

#ifndef LISTVIEWSHOW_H
#define LISTVIEWSHOW_H

#include <QWidget>
#include <QListView>
#include <QStringListModel>

namespace Ui {
class listviewshow;
}

class listviewshow : public QWidget
{
    Q_OBJECT

public:
    explicit listviewshow(QWidget *parent = nullptr);
    ~listviewshow();

    void init();

public slots:
    void onButtonClicked(int);

private:
    Ui::listviewshow *ui;
    QListView *p_listview;
};

#endif // LISTVIEWSHOW_H
// listviewshow.cpp

#include "listviewshow.h"
#include "ui_listviewshow.h"
#include <QVBoxLayout>
#include <QStandardItemModel>
#include <QSignalMapper>

listviewshow::listviewshow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::listviewshow),
    p_listview(nullptr)
{
    ui->setupUi(this);
    init();
}

listviewshow::~listviewshow()
{
    delete ui;
}

void listviewshow::init()
{
    // 创建 QListView 和模型
    QStandardItemModel *model = new QStandardItemModel(this);

    // 添加多个项到模型
    for (int i = 0; i < 4; ++i)
    {
        QStandardItem *item = new QStandardItem();
        item->setSizeHint(QSize(10, 50));
        model->appendRow(item);
    }

    ui->listView->setModel(model);


    // 创建信号映射器
    QSignalMapper *signalMapper = new QSignalMapper(this);

    // 为每个项设置自定义 QWidget
    for (int row = 0; row < model->rowCount(); ++row)
    {
        QWidget *widget = new QWidget();
        //widget->setMinimumHeight(25);
        QHBoxLayout *layout = new QHBoxLayout(widget);

        QLabel *label = new QLabel("Item " + QString::number(row + 1), widget);
        QPushButton *button = new QPushButton("Button", widget);

        // 将按钮与信号映射器绑定
        signalMapper->setMapping(button, row);  // 映射索引到按钮
        connect(button, &QPushButton::clicked, signalMapper, QOverload<>::of(&QSignalMapper::map));

        layout->addWidget(label);
        layout->addWidget(button);
        widget->setLayout(layout);

        ui->listView->setIndexWidget(model->index(row, 0), widget);
    }
    // 连接信号映射器的信号到槽
    connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(onButtonClicked(int)));
}

void listviewshow::onButtonClicked(int row)
{
    qDebug() << "Button clicked for item row: " << row;
    //确认是哪一个按钮后,就能通过按钮的序号到list中去拿对应的数据
    //ui->listView->model()->index(row, 0);
    QWidget *targetWidget = ui->listView->indexWidget(ui->listView->model()->index(row, 0));
    QLabel *label = targetWidget->findChild<QLabel *>();
    qDebug() << "Found QLabel:" << label->text();
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值