为 QTreeView 中的项目分配图标
Assigning Icons to items in QTreeView
我有一个 class 继承自 QTreeView。我需要为不同类型的文件和目录分配图标。 this question:
给出了这个解决方案
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);
}
我的 class 没有继承自 QFileSystemModel 而是将其组合进去,这意味着我无法覆盖函数 data()
。
从上面来看,图标将如何显示?是通过在构造函数中调用 data() 吗?
您需要将模型添加到具有根节点的树中:
QStandardItemModel* model = new QStandardItemModel;
QStandardItem * rootNode = model->invisibleRootItem();
this->setModel(model); //Your class inherts from QTreeView
然后添加带有图标的项目:
QStandardItem* item = new QStandardItem("myItem")
item->setIcon(QIcon("icon.jpg"));
rootNode->appendRow(item);
你可能有这样的事情:http://hpics.li/e9dc5dd
我想补充一点,如果您在自定义模型子类 QAbstractItemModel
中使用 QStandardItem
,则需要在重新实现的 data() 函数中添加 role == Qt::DecorationRole
,以便图标可以显示在视图上。
有点像:
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();
}
我有一个 class 继承自 QTreeView。我需要为不同类型的文件和目录分配图标。 this question:
给出了这个解决方案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);
}
我的 class 没有继承自 QFileSystemModel 而是将其组合进去,这意味着我无法覆盖函数 data()
。
从上面来看,图标将如何显示?是通过在构造函数中调用 data() 吗?
您需要将模型添加到具有根节点的树中:
QStandardItemModel* model = new QStandardItemModel;
QStandardItem * rootNode = model->invisibleRootItem();
this->setModel(model); //Your class inherts from QTreeView
然后添加带有图标的项目:
QStandardItem* item = new QStandardItem("myItem")
item->setIcon(QIcon("icon.jpg"));
rootNode->appendRow(item);
你可能有这样的事情:http://hpics.li/e9dc5dd
我想补充一点,如果您在自定义模型子类 QAbstractItemModel
中使用 QStandardItem
,则需要在重新实现的 data() 函数中添加 role == Qt::DecorationRole
,以便图标可以显示在视图上。
有点像:
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();
}