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

Posted

技术标签:

【中文标题】如何在 QFileSystemModel 上隐藏文件扩展名【英文标题】:How do you hide file extensions on a QFileSystemModel 【发布时间】:2012-05-31 00:10:21 【问题描述】:

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

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

谢谢

【问题讨论】:

请放一段代码 【参考方案1】:

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

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);

【讨论】:

【参考方案2】:

这个解决方案对我有用,并且对用户完全隐藏了扩展。

QFileSystemModel 类中覆盖datasetData

def data(self, index, role):
    if role == Qt.EditRole:
        return self.fileName(index)
    else:
        return super(ContentFileSystemModel, self).data(index, role)

def setData(self, index: QModelIndex, value, role: int=...) -> bool:
    print("setData")
    if role == Qt.EditRole:
        if self.isDir(index):
            d = ""
        else:
            d = "."
        return super(ContentFileSystemModel, self).setData(index, str(value) + d + self.fileInfo(index).completeSuffix(), role)
    return super(ContentFileSystemModel, self).setData(index, value, role)

创建QStyledItemDelegate

class NameDelegate(QStyledItemDelegate):

    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        if isinstance(index.model(), QFileSystemModel):
            if not index.model().isDir(index):
                option.text = index.model().fileInfo(index).baseName()

    def setEditorData(self, editor, index):
        if isinstance(index.model(), QFileSystemModel):
            if not index.model().isDir(index):
                editor.setText(index.model().fileInfo(index).baseName())
            else:
                super().setEditorData(editor, index)

并将其设置在您的视图中:

delegate = NameDelegate(self.lv_file_manager)
view.setItemDelegate(delegate)

【讨论】:

【参考方案3】:

您必须针对您的情况创建一个项目委托,并将其与您的视图相关联。

如文档here中所述

void QAbstractItemView::setItemDelegate(QAbstractItemDelegate * delegate)

为此视图及其模型设置项目委托。如果您想完全控制项目的编辑和显示,这将非常有用。

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

【讨论】:

【参考方案4】:

如果您使用 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);

【讨论】:

以上是关于如何在 QFileSystemModel 上隐藏文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中使用 QFileSystemModel 设置文本颜色 QTableView?

CoInitialize() 是不是总是在每个 .Net Framework / .Net Core 线程上隐式调用?

dotnet C# 如何正确获取藏文的字数

dotnet C# 如何正确获取藏文的字数

dotnet C# 如何正确获取藏文的字数

QFileSystemModel如何将RootPath设置到linux上的另一个驱动器