Как скрыть расширения файлов в QFileSystemModel

Я привязал QFileSystemModel к QTreeView. QFileSystemModel имеет readOnly значение false, поэтому пользователь может переименовывать файлы... Однако я не хочу, чтобы пользователь случайно переименовал файл и забыл его расширение, поскольку это приведет к его исключению из QTreeView, поскольку я фильтрую типы файлов ...

Как я могу скрыть расширения файлов, сохраняя работоспособность переименования?

Спасибо


person Yassir Ennazk    schedule 31.05.2012    source источник
comment
Пожалуйста, поместите кусок кода   -  person ScarCode    schedule 31.05.2012


Ответы (4)


попробуйте переопределить 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);
}
person user4294967296    schedule 01.06.2012

Вы должны создать делегат элемента, специфичный для вашей ситуации, и связать его с вашим представлением.

Как указано в документации здесь

void QAbstractItemView::setItemDelegate(QAbstractItemDelegate * delegate)

Задает делегат элемента для этого представления и его модели для делегирования. Это полезно, если вы хотите полностью контролировать редактирование и отображение элементов.

Этот делегат будет отвечать за отображение имени файла без расширения и разрешать редактирование имени файла.

person felixgaal    schedule 31.05.2012

Если вы используете 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);
person Cedric Perthuis    schedule 04.11.2019

Это решение работает для меня и полностью скрывает расширение от пользователя.

Переопределить data и setData в классе QFileSystemModel.

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)
person E.G. Cortes    schedule 26.12.2020