关于qt:在QTreeView中为项目分配图标

Assigning Icons to items in QTreeView

我有一个从QTreeView继承的类。我需要将图标分配给不同类型的文件和目录。这个问题提供了以下解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
QVariant MyQFileSystemModel::data( const QModelIndex& index, int role ) const {
    if( role == Qt::DecorationRole )
    {
        QFileInfo info = MyQFileSystemModel::fileInfo(index);

        if(info.isFile())
        {
            if(info.suffix() =="dat")
                return QPixmap(":/icons/File_Icon.png");//I pick the icon depending on the extension
            else if(info.suffix() =="mcr")
                return QPixmap(":/icons/Region_Icon.png");
        }
    }
    return QFileSystemModel::data(index, role);
}

我的类不是从QFileSystemModel继承而是将其组合进来,这意味着我不能覆盖函数data()
从上面看,图标将如何显示?是通过在构造函数中调用data()来实现的吗?


您需要使用根节点将模型添加到树中:

1
2
3
QStandardItemModel* model = new QStandardItemModel;
QStandardItem * rootNode = model->invisibleRootItem();
this->setModel(model); //Your class inherts from QTreeView

,然后添加带有图标的项目:

1
2
3
QStandardItem* item = new QStandardItem("myItem")
item->setIcon(QIcon("icon.jpg"));
rootNode->appendRow(item);

您可能会有类似这样的内容:http://hpics.li/e9dc5dd


我想补充一点,如果在自定义模型的子类QAbstractItemModel中使用QStandardItem,则需要在重新实现的data()函数中添加role == Qt::DecorationRole,以便图标可以显示在视图上。 >

有点像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
QVariant SnapshotTreeModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role == Qt::DisplayRole){
        ....
        return item->text();
    }else if (role == Qt::DecorationRole){
        QStandardItem *item = static_cast<QStandardItem *>(index.internalPointer());
        return item->icon();
    }

    return QVariant();
}