【QT学习十】QListView

发布时间:2024年01月12日

目录

一、QListView 概述

二、QListView 的主要特性包括:

三、基本用法

1、创建及基本属性设置

2、添加显示的值

3、获取ListView中的内容

4、列表模式和图标模式之间切换

5、自定义

四、提高性能

五、总结


一、QListView 概述

????????QListView 是一个用于显示列表数据的控件,它提供了灵活的视图模型以及对列表项的高度自定义的能力。

????????1、QListView 是Qt中的一个视图类,用于展示模型中的数据。它基于QAbstractItemView,支持多种视图模式,包括列表视图(List View)、图标视图(Icon View)、详细信息视图(Detail View)等。

????????2、QListView 类是Qt中模型/视图框架的一部分,通常与QStandardItemModel或从QAbstractItemModel派生的自定义模型一起使用。

二、QListView 的主要特性包括:

  1. 模型-视图架构: 遵循模型-视图架构,其中数据存储在模型中,而视图负责呈现该数据。

  2. 灵活的显示模式: QListView 支持不同的显示模式,包括列表视图(基于文本)和图标视图(基于图标),这种灵活性允许选择最适合的呈现方式。

  3. 自定义: 可以通过使用委托(delegates)自定义视图中项的外观,委托控制数据的渲染和编辑方式。

  4. 项目布局: 项目可以按照从上到下或者从左到右等方向进行布局,可以是固定的,也可以允许移动。视图的flow()和movement()属性控制这些行为。

  5. 选择处理: 提供了处理项目选择的机制,允许用户与显示的数据进行交互。

三、基本用法

1、创建及基本属性设置

    m_listView->setSelectionMode(QAbstractItemView::SingleSelection);
    m_listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    m_listView->setFocusPolicy(Qt::NoFocus);

这段代码设置了 QListView 的一些属性,定制了其行为:

  1. setSelectionMode(QAbstractItemView::SingleSelection):设置选择模式为单选模式,即只能选择一个项目。

  2. setEditTriggers(QAbstractItemView::NoEditTriggers):设置编辑触发器为不可编辑,禁止编辑项目。

  3. setFocusPolicy(Qt::NoFocus):设置焦点策略为 Qt::NoFocus,禁止该视图接受焦点。

2、添加显示的值

    // 创建QStandardItemModel作为数据模型
    QStandardItemModel *model = new QStandardItemModel(m_listView);

    // 向模型添加数据项
    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
    m_listView->setModel(model);

3、获取ListView中的内容

    QAbstractItemModel* model = m_listView->model();
    QModelIndexList indexes;
    for (int var = 0; var < model->rowCount(); ++var) {
        QModelIndex index = model->index(var,0);
        indexes.append(index);
    }

    for(const QModelIndex &index :indexes){
        QVariant value = model->data(index,Qt::CheckStateRole);
        if(value.isValid() && value.toInt() == Qt::Checked){
            QVariant val = model->data(index,Qt::DisplayRole);
            qDebug() << val.toString();
        }
    }

????????这段代码通过遍历 QListView 的模型中的所有行,获取每行第一列的索引,并检查该行是否处于选中状态(Qt::Checked)。如果是选中状态,就获取该行的显示数据并输出。

4、列表模式和图标模式之间切换

   // 创建一个按钮用于切换显示模式
    QPushButton *toggleButton = new QPushButton("Toggle View Mode");

    // 连接按钮点击事件,切换QListView的显示模式
    QObject::connect(toggleButton, &QPushButton::clicked, [&]() {
        if (m_listView->viewMode() == QListView::ListMode) {
            m_listView->setViewMode(QListView::IconMode);
            // 设置图标大小
            m_listView->setGridSize(QSize(50, 50));  
        } else {
            m_listView->setViewMode(QListView::ListMode);
        }
    });

    // 布局管理
    QBoxLayout *box = new QBoxLayout(QBoxLayout::TopToBottom);
    box->setContentsMargins(0,0,0,0);
    box->setSpacing(0);
    box->addWidget(toggleButton);
    box->addWidget(m_listView);

5、自定义

????????允许通过委托(delegates)自定义项目的外观和交互方式。

class CustomDelegate : public QStyledItemDelegate {
public:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
        // 获取项目的文本内容
        QString text = index.data(Qt::DisplayRole).toString();

        // 设置不同的颜色和字体
        painter->save();
        if (index.row() % 2 == 0) {
            painter->setPen(Qt::blue);
            painter->setFont(QFont("Arial", 12, QFont::Bold));
        } else {
            painter->setPen(Qt::green);
            painter->setFont(QFont("Times", 14, QFont::Light));
        }

        // 绘制文本
        painter->drawText(option.rect, Qt::AlignCenter, text);
        painter->restore();
    }
};


    // 使用自定义委托
    CustomDelegate *customDelegate = new CustomDelegate;
    m_listView->setItemDelegate(customDelegate);

????????在这个例子中,我们创建了一个自定义的委托类 CustomDelegate 继承自 QStyledItemDelegate。在 paint 函数中,我们根据项目的行数(偶数或奇数)设置了不同的颜色和字体,然后使用 QPainter 绘制了文本。

四、提高性能

????????为了在显示大量项目时提高性能,可以向视图提供有关其处理的数据的提示。对于预计显示具有相等大小的项目的视图,可以采取的一种方法是将uniformItemSizes属性设置为true。

五、总结

????????QListView 是Qt中一个强大的列表显示控件,它的强大之处在于其适用于多种数据展示需求,并提供了许多可定制的选项。通过选择合适的模型、设置不同的视图模式以及调整布局参数,可以创建出适用于不同场景的用户界面。

文章来源:https://blog.csdn.net/baidu_18624493/article/details/135554714
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。