如何在QFileSystemModel上隐藏文件扩展名

问题描述 投票:0回答:3

我已将QFileSystemModel绑定到QTreeView。QFileSystemModel的readOnly设置为false,因此用户可以重命名文件...但是我不希望用户意外重命名文件并忘记它的扩展名,因为这将导致它从QTreeView中排除,因为我正在过滤文件类型...

如何隐藏保持重命名功能的文件扩展名?

谢谢

qt view model qtreeview qfilesystemmodel
3个回答
2
投票

尝试重新实现角色data()setData()Qt::EditRole

virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
{
if (role == Qt::EditRole)
   {
   return QVariant(fileName(index));
   }
else
   return QFileSystemModel::data(index, role);
}

virtual bool setData ( const QModelIndex & idx, const QVariant & value, int role = Qt::EditRole )
{
if (role == Qt::EditRole)
   {
   return QFileSystemModel::setData( idx, QVariant(value.toString() + fileInfo(idx).completeSuffix()), role);
   }
else
   return QFileSystemModel::setData(idx, value, role);
}

0
投票

您必须创建特定于您情况的项目委托,并将其与您的视图关联。

如文档here中所述

void QAbstractItemView::setItemDelegate(QAbstractItemDelegate * delegate)

设置此视图的项目委托及其要委托的模型。如果要完全控制项目的编辑和显示,此功能很有用。

此委托人将负责显示不带扩展名的文件名,并允许编辑文件名。


0
投票

如果您按照上述建议使用QFileSystemModel和委托,则可能是最简单的选择。以下委托使您可以隐藏文件扩展名。请注意,您不仅限于删除扩展名,还可以更改文件名。

class MyItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
protected:
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
    {
        QStyleOptionViewItem opt = option;
        initStyleOption(&opt, index);
        QFileInfo fileinfo(opt.text);
        opt.text = fileinfo.completeBaseName();
        QStyle* style = opt.widget ? opt.widget->style() : QApplication::style();
        style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
    }

    QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
    {
        QSize result = QStyledItemDelegate::sizeHint(option, index);
        return result;
    }
};

然后您可以将此委托应用于QTreeView或QListView例如:

MyItemDelegate* itemDelegate = new MyItemDelegate;
myListView_->setItemDelegate(itemDelegate);
© www.soinside.com 2019 - 2024. All rights reserved.