Qt怎么自定义listview的model

2025-06-12更新于 2025-08-12367 字4 分钟Qt
目录

怎么自定义model

自定义的类通过继承QAbstractListModel来实现

cpp
class MyListModel : public QAbstractListModel {
	Q_OBJECT

public:
	MyListModel(QObject *parent = nullptr) : QAbstractListModel(parent) {
		// 初始化数据
		listData << "Item 1" << "Item 2" << "Item 3";
	}

	int rowCount(const QModelIndex &parent = QModelIndex()) const override {
		Q_UNUSED(parent);
		return listData.count();  // 返回行数
	}

	QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override {
		if (!index.isValid() || index.row() >= listData.size())
			return QVariant();

		if (role == Qt::DisplayRole) {
			return listData.at(index.row());  // 返回对应的数据显示
		}

		return QVariant();
	}

private:
	QStringList listData;  // 存储数据的容器
};

需要重写下面的方法

cpp
int rowCount(const QModelIndex &parent = QModelIndex()) const override
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const oerride

特别需要注意的是

方法 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override 中的role参数,有如下含义
role 是一个 int 类型的变量,用于表示视图请求的数据类型。在 Qt 中,role 的值是通过 Qt::ItemDataRole 枚举来定义的。这个枚举包括一些常见的角色以及你可以定义的自定义角色。

常见的 role 值:

  • Qt::DisplayRole (0):表示要显示的文本内容。这是最常用的角色,通常是视图中显示的主要信息。
  • Qt::DecorationRole (1):表示图标或装饰的内容,通常用来显示在文本旁边的图标或其他视觉元素。
  • Qt::EditRole (2):表示编辑时使用的文本内容。当项处于编辑模式时,视图会使用这个角色的数据。
  • Qt::ToolTipRole (3):表示当鼠标悬停在项上方时显示的工具提示内容。
  • Qt::StatusTipRole (4):表示状态栏显示的文本内容。
  • Qt::WhatsThisRole (5):表示”What’s This?”帮助提示内容。
  • Qt::SizeHintRole (13):表示用于控制项的大小(宽度和高度)的提示。
  • Qt::FontRole (6):表示文本的字体。
  • Qt::TextAlignmentRole (7):表示文本的对齐方式。
  • Qt::ForegroundRole (8):表示文本的前景色(即文本颜色)。
  • Qt::BackgroundRole (9):表示项的背景色。

具体使用方法见如下函数

cpp
QVariant MyListModel::data(const QModelIndex &index, int role) const {
    if (!index.isValid() || index.row() >= listData.size()) {
        return QVariant();
    }

    const MyItem &item = listData.at(index.row());

    switch (role) {
        case Qt::DisplayRole:
            return item.name;  // 显示名称
        case Qt::DecorationRole:
            return QIcon(":/icons/item.png");  // 显示图标
        case Qt::ToolTipRole:
            return item.description;  // 显示工具提示
        case Qt::ForegroundRole:
            return QColor(Qt::blue);  // 文本颜色设置为蓝色
        case Qt::BackgroundRole:
            return QColor(Qt::yellow);  // 项背景设置为黄色
        case Qt::TextAlignmentRole:
            return Qt::AlignCenter;  // 文本居中对齐
        default:
            return QVariant();  // 未处理的角色返回空
    }
}

希望我的博客能够对你有帮助

hhhh6448

hhhh6448

转载请注明出处,欢迎留言交流~

评论

评论区还没开放,部署评论服务后就能留言啦~

主题色