我已将 QFileSystemModel 绑定到 QTreeView。QFileSystemModel 已将 readOnly 设置为 false,因此用户可以重命名文件...但是我不希望用户意外重命名文件并忘记其扩展名,因为这将导致其从 QTreeView 中排除,因为我正在过滤文件类型...
如何隐藏保持重命名功能的文件扩展名?
谢谢
我已将 QFileSystemModel 绑定到 QTreeView。QFileSystemModel 已将 readOnly 设置为 false,因此用户可以重命名文件...但是我不希望用户意外重命名文件并忘记其扩展名,因为这将导致其从 QTreeView 中排除,因为我正在过滤文件类型...
如何隐藏保持重命名功能的文件扩展名?
谢谢
尝试重新实现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);
}
该解决方案对我有用,并且对用户完全隐藏了扩展。
覆盖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)
您必须针对您的情况创建一个项目委托,并将其与您的视图相关联。
如文档here中所述
void QAbstractItemView::setItemDelegate(QAbstractItemDelegate * delegate)
将此视图及其模型的项目委托设置为委托。如果您想完全控制项目的编辑和显示,这很有用。
该委托将负责显示不带扩展名的文件名,并允许编辑文件名。
如果您使用上面建议的委托使用 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);