QListView
开发工具:QT Creator
QListView 是 Qt 中用于显示列表数据的视图控件。它继承自 QAbstractItemView,通常与模型(如 QStringListModel、QStandardItemModel 或自定义模型)配合使用,用于呈现数据项的列表。
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)(一)-CSDN博客
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();
}
评论前必须登录!
注册