云计算百科
云计算领域专业知识百科平台

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

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();
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » QT的视图类(QTableView和QListView)(二)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!