【Qt笔记】QListView控件详解

2024-08-30 04:20

本文主要是介绍【Qt笔记】QListView控件详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

目录

引言

一、QListView 基本概念

1.1 定义与功能

1.2 架构原理

二、QListView 基本使用

2.1 创建 QListView 和 Model

2.2 设置 QListView 的属性

2.3 处理用户交互

三、QListView 高级技巧

3.1 自定义委托

3.2 使用 QStandardItemModel

3.3 实现拖放功能

四、QListView 与其他 Qt 控件的对比

4.1 与 QListWidget 的对比

4.2 与 QTableView 的对比

五、整体代码示例 

注意 

结语


引言

QListView 是 Qt 框架中一个功能强大的控件,用于展示列表数据。它基于模型/视图/委托(Model/View/Delegate)架构,提供了灵活的数据展示和处理能力。以下是对 QListView 控件的详细解析,内容涵盖其基本概念、基本使用、高级技巧以及与其他 Qt 控件的对比等方面。

一、QListView 基本概念

1.1 定义与功能

QListView 是 Qt 中的一个视图类,专门用于展示列表数据。它支持多种视图模式,包括列表视图(List View)和图标视图(Icon View),允许开发者根据需求选择合适的展示方式。QListView 通过与数据模型(如 QStringListModel、QStandardItemModel)配合使用,实现了数据与视图的分离,提高了应用程序的灵活性和可维护性。

1.2 架构原理

QListView 遵循模型/视图/委托(MVC)架构,其中:

  • Model:数据模型,负责管理数据的存储和操作。
  • View:视图,负责展示数据。在 QListView 中,视图负责根据模型提供的数据进行渲染。
  • Delegate:委托,负责绘制视图中的每一项内容以及处理编辑操作。QListView 允许通过自定义委托来改变项的外观和交互方式。

二、QListView 基本使用

2.1 创建 QListView 和 Model

要使用 QListView,首先需要创建一个 QListView 控件和一个数据模型。数据模型可以是 Qt 提供的标准模型(如 QStringListModel、QStandardItemModel),也可以是自定义的模型。以下是一个简单的示例代码,展示了如何创建 QListView 和 QStringListModel 并将其关联起来:

#include <QApplication>  
#include <QListView>  
#include <QStringListModel>  int main(int argc, char *argv[]) {  QApplication app(argc, argv);  QListView listView;  QStringListModel model;  QStringList data = {"Item 1", "Item 2", "Item 3"};  model.setStringList(data);  listView.setModel(&model);  listView.show();  return app.exec();  
}

实现效果:

 

2.2 设置 QListView 的属性

QListView 提供了多种属性设置,用于控制其外观和行为。

以下是为QListView设置一些常用属性的代码示例。请注意,这些示例假设您已经有一个QListView的实例(比如名为listView)以及相应的模型和数据已经设置好了。 

  • setSelectionMode(QAbstractItemView::SelectionMode mode):设置选择模式,如单选(SingleSelection)、多选(MultiSelection)等。
// 设置选择模式为单选  
listView.setSelectionMode(QAbstractItemView::SingleSelection);  // 或者设置为多选  
// listView.setSelectionMode(QAbstractItemView::MultiSelection);  // 或者设置为扩展选择(连续多选)  
// listView.setSelectionMode(QAbstractItemView::ExtendedSelection);  // 或者设置为无选择(通常不常用,但可用于某些特殊场景)  
// listView.setSelectionMode(QAbstractItemView::NoSelection);
  • setEditTriggers(QAbstractItemView::EditTriggers triggers):设置编辑触发器,如双击编辑(DoubleClicked)等。
// 设置双击项时触发编辑  
listView.setEditTriggers(QAbstractItemView::DoubleClicked);  // 也可以组合多个触发器,但通常对于QListView来说,只设置双击就足够了  
// 例如,同时设置双击和选中时编辑(但通常不推荐这样设置,因为对于列表来说,选中时编辑可能不太直观)  
// listView.setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);  // 注意:对于QListView来说,SelectedClicked可能不是很有用,因为它更适用于表格或树形视图
  • setViewMode(QListView::ViewMode mode):设置视图模式,如列表模式(ListMode)、图标模式(IconMode)等。
// 设置视图模式为列表模式(这是QListView的默认模式)  
listView.setViewMode(QListView::ListMode);  // 注意:QListView只支持ListMode,而不支持IconMode。IconMode是QListView的父类QAbstractItemView的一个枚举值,  
// 但QListView并没有实现它。如果你需要图标模式,可能需要考虑使用QListView的兄弟类QIconView(但请注意,QIconView在Qt的某些版本中可能不是标准的一部分,  
// 或者你可能需要使用QListView的替代品,如QListView配合自定义委托来模拟图标模式)。  // 由于QListView不支持IconMode,以下代码是无效的,仅作为说明:  
// listView.setViewMode(QListView::IconMode); // 这将不会编译或运行时不会按预期工作
  • setSpacing(int space):设置项之间的间距。
//设置间距为10
_listView->setSpacing(10);

2.3 处理用户交互

QListView 支持多种用户交互方式,如点击、双击、拖拽等。开发者可以通过连接信号和槽来处理这些交互。例如,可以连接clicked信号来处理项被点击的事件:

QObject::connect(&listView, &QListView::clicked, [](const QModelIndex &index) {  qDebug() << "Item clicked:" << index.data().toString();  
});

三、QListView 高级技巧

3.1 自定义委托

QListView 允许通过自定义委托来改变项的外观和交互方式。自定义委托需要继承自 QStyledItemDelegate 或其他委托基类,并重写相关方法。以下是一个自定义委托的示例,用于改变项的背景颜色:

class CustomDelegate : public QStyledItemDelegate {  
public:  void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {  painter->save();  painter->setBrush(QColor(Qt::yellow));  painter->drawRect(option.rect);  painter->restore();  QStyledItemDelegate::paint(painter, option, index);  }  
};  // 使用自定义委托  
CustomDelegate *delegate = new CustomDelegate;  
listView.setItemDelegate(delegate);

3.2 使用 QStandardItemModel

QStandardItemModel 是一个功能强大的模型,支持复杂的数据结构。与 QStringListModel 相比,QStandardItemModel 允许创建具有任意层次结构的数据模型,并为每一项设置更多的属性。以下是如何使用 QStandardItemModel 的示例:

QStandardItemModel model;  
QStandardItem *item1 = new QStandardItem("Item 1");  
QStandardItem *item2 = new QStandardItem("Item 2");  
model.appendRow(item1);  
model.appendRow(item2);  
listView.setModel(&model);

3.3 实现拖放功能

QListView 支持拖放操作,可以通过设置视图的属性来启用拖放功能,并实现自定义的拖放逻辑。以下是如何启用拖放功能的示例:

listView.setDragEnabled(true);  
listView.setAcceptDrops(true);  
listView.setDropIndicatorShown(true);  
listView.setDefaultDropAction(Qt::MoveAction);

四、QListView 与其他 Qt 控件的对比

4.1 与 QListWidget 的对比

  • QListWidget 是基于项的控件,它内部已经包含了默认的模型,使用起来相对简单,但灵活性较低。
  • QListView 则是基于模型/视图/委托架构的控件,需要与数据模型配合使用,提供了更高的灵活性和可定制性。

4.2 与 QTableView 的对比

  • QTableView 用于展示表格数据,支持行和列的显示。
  • QListView 则专注于列表数据的展示,不支持列的概念。

五、整体代码示例 

下面是一个包含高级功能的QListView控件的整体代码示例。这个示例将展示如何设置模型、委托(用于自定义项的显示)、选择模式、拖放功能以及如何使用样式表来美化视图。

请注意,由于QListView本身不直接支持图标模式(除了通过自定义委托模拟外),这个示例将专注于列表模式,但会展示如何通过委托来自定义项的显示。

#include <QApplication>  
#include <QListView>  
#include <QStringListModel>  
#include <QStyledItemDelegate>  
#include <QPainter>  
#include <QDrag>  
#include <QMimeData>  // 自定义委托  
class MyItemDelegate : public QStyledItemDelegate {  
public:  MyItemDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}  void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {  QStyleOptionViewItem opt = option;  initStyleOption(&opt, index);  // 在这里可以自定义绘制逻辑  // 例如,我们可以添加一个图标  QIcon icon(":/path/to/your/icon.png"); // 确保替换为有效的图标路径  QRect iconRect(opt.rect.left() + 5, opt.rect.top() + (opt.rect.height() - icon.actualSize(QSize(32, 32)).height()) / 2,  icon.actualSize(QSize(32, 32)).width(), icon.actualSize(QSize(32, 32)).height());  icon.paint(painter, iconRect);  // 绘制文本  painter->save();  painter->setPen(opt.palette.text().color());  QRect textRect = opt.rect.adjusted(iconRect.width() + 10, 0, 0, 0);  painter->drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, index.data().toString());  painter->restore();  }  // 如果需要处理编辑或其他交互,可以重写其他方法  
};  // 拖放支持  
class MyListView : public QListView {  Q_OBJECT  
public:  MyListView(QWidget *parent = nullptr) : QListView(parent) {  setDragEnabled(true);  setAcceptDrops(true);  setDefaultDropAction(Qt::MoveAction);  setSelectionMode(QAbstractItemView::ExtendedSelection);  // 设置自定义委托  setItemDelegate(new MyItemDelegate(this));  }  protected:  void mouseMoveEvent(QMouseEvent *event) override {  if (event->buttons() != Qt::LeftButton)  return;  QDrag *drag = new QDrag(this);  QMimeData *mimeData = new QMimeData;  // 假设我们拖放的是项的索引  QList<QModelIndex> indexes = selectedIndexes();  QByteArray encodedData;  QDataStream stream(&encodedData, QIODevice::WriteOnly);  foreach (const QModelIndex &index, indexes) {  stream << index.row();  }  mimeData->setData("application/vnd.myapp.itemlist", encodedData);  drag->setMimeData(mimeData);  // 可以设置拖动时的图标和光标等  QPixmap pixmap(":/path/to/drag_icon.png"); // 确保替换为有效的图标路径  if (!pixmap.isNull())  drag->setPixmap(pixmap);  if (drag->exec(Qt::MoveAction) == Qt::MoveAction) {  // 处理移动后的逻辑(如果需要的话)  }  }  // 实现dropEvent等方法来处理放置操作(这里省略)  
};  int main(int argc, char *argv[]) {  QApplication app(argc, argv);  QStringList data = {"Item 1", "Item 2", "Item 3", "Item 4", "Item 5"};  QStringListModel model(data);  MyListView listView;  listView.setModel(&model);  listView.show();  return app.exec();  
}  #include "main.moc" // 如果你使用的是qmake,并且自定义了QWidget子类,则需要这一行来包含moc生成的元对象代码

注意 

1. 自定义委托:MyItemDelegate 类重写了 paint 方法来在项旁边绘制一个图标,并调整了文本的绘制位置。
2. 拖放支持:MyListView 类继承自 QListView 并启用了拖放功能。在 mouseMoveEvent 中,我们创建了一个 QDrag 对象,并使用 QMimeData 来存储要拖动的数据(在这个例子中是选中项的索引)。你可以根据需要修改这部分代码来存储更复杂的数据。
3. 图标和样式:在示例中,我使用了 ":/path/to/your/icon.png" 和 ":/path/to/drag_icon.png" 作为图标路径。你需要将这些路径替换为实际有效的资源路径。Qt 资源系统允许你将文件嵌入到应用程序的可执行文件中,这样你就不必担心文件路径问题了。
4. 样式表:虽然示例中没有直接使用样式表,但你可以通过调用 listView.setStyleSheet(...) 来应用 CSS 样式表,以美化 QListView 的外观。
5. 编译和运行:确保你的 Qt 环境已经设置正确,并且你有一个有效的 Qt 项目文件(如 .pro 文件)来编译和运行这个示例。如果你使用的是 Qt Creator,它通常会为你处理这些设置。

结语

QListView 是 Qt 框架中一个功能强大的控件,用于展示列表数据。它基于模型/视图/委托架构,提供了灵活的数据展示和处理能力。通过自定义委托和使用不同的数据模型,QListView 可以满足各种复杂的数据展示需求。同时,QListView 还支持拖放操作等高级功能,进一步提升了其在实际应用中的价值。

以上就是关于Qt中QListView的全部介绍,如有不足与缺陷之处,欢迎评论区留言!!! 

 

这篇关于【Qt笔记】QListView控件详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1119782

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML