qt QListView详解
1、概述
QListView 是 Qt 框架中的一个视图类,用于展示模型中的数据。它基于 QAbstractItemView,支持多种视图模式,如列表视图(List View)、图标视图(Icon View)等。QListView 是模型/视图框架的一部分,通常与 QStandardItemModel 或从 QAbstractItemModel 派生的自定义模型一起使用。在这种模型-视图架构中,数据存储在模型中,而视图负责呈现该数据。QListView 提供了灵活的显示模式和高度的自定义能力,使得开发者可以根据需要选择最适合的呈现方式。
2、重要方法
QListView 提供了多种方法来管理和展示数据,以下是一些重要的方法:
- setSelectionMode:设置选择模式,如单选(SingleSelection)、多选(MultiSelection)等。
- setEditTriggers:设置编辑触发器,决定何时可以编辑列表项。
- setFocusPolicy:设置焦点策略,决定视图是否可以接受焦点。
- setModel:设置数据模型,将数据模型与视图关联起来。
- viewMode 和 setViewMode:获取和设置视图模式,如列表模式(ListMode)和图标模式(IconMode)。
- setGridSize:在图标模式下设置网格大小。
此外,QListView 还支持通过委托(delegates)自定义视图中项的外观和交互方式,这通常通过重写 QStyledItemDelegate 类的相关方法来实现。
3、重要信号
QListView 发射多种信号来响应用户的操作,以下是一些重要的信号:
- clicked:单击某项时发射此信号。
- doubleClicked:双击某项时发射此信号。
- activated:当用户激活某个项目时发射此信号。
- entered:当鼠标光标进入某个项目时发射此信号。
- iconSizeChanged:在视图可见时设置图标大小时发射此信号。
- indexesMoved:在视图中移动索引时发射此信号。
- pressed:按下鼠标按钮时发射此信号。
- viewportEntered:当鼠标光标进入视图时发射此信号。
这些信号允许开发者在用户与 QListView 交互时执行特定的操作。
4、视图模式和布局方向
ViewMode
QListView::ViewMode 枚举定义了视图模式:
- QListView::ListMode:列表模式。
- QListView::IconMode:图标模式。
Flow
QListView::Flow枚举定义了项目布局方向:
- QListView::LeftToRight:从左到右布局。
- QListView::TopToBottom:从上到下布局。
#include <QApplication>
#include <QListView>
#include <QStandardItemModel>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建一个 QListView 实例
QListView listView;
// 创建一个模型并添加一些数据
QStandardItemModel model;
for (int i = 0; i < 10; ++i) {
QStandardItem *item = new QStandardItem(QString("Item %1").arg(i));
item->setCheckable(true); // 显示复选框
item->setCheckState(Qt::Unchecked); // 设置复选框状态
model.appendRow(item);
}
// 将模型设置给 QListView
listView.setModel(&model);
// 设置选择模式为单选模式
listView.setSelectionMode(QAbstractItemView::SingleSelection);
// 连接 clicked 信号到槽函数
QObject::connect(&listView, &QListView::clicked, [&](const QModelIndex &index) {
QVariant value = model.data(index, Qt::DisplayRole);
qDebug() << "Clicked item:" << value.toString();
});
// 显示 QListView
listView.show();
return app.exec();
}
觉得有帮助的话,打赏一下呗。。