QT的视图类(QTableView和QListView)(二) QListView开发工具QT CreatorQListView是 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 deselectedvoid 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-findChildQLabel *(); qDebug() Found QLabel: label-text(); }