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

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

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

谢谢

【问题讨论】:

  • 请放一段代码

标签: qt view model qtreeview qfilesystemmodel


【解决方案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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多