QFileSystemModel を QTreeView にバインドしました。QFileSystemModel は readOnly を false に設定しているため、ユーザーはファイルの名前を変更できます... ...
名前の変更を機能させたままファイル拡張子を非表示にするにはどうすればよいですか?
ありがとう
QFileSystemModel を QTreeView にバインドしました。QFileSystemModel は readOnly を false に設定しているため、ユーザーはファイルの名前を変更できます... ...
名前の変更を機能させたままファイル拡張子を非表示にするにはどうすればよいですか?
ありがとう
再実装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)
状況に固有のアイテム デリゲートを作成し、それをビューに関連付ける必要があります。
ここのドキュメントに記載されているように
void QAbstractItemView::setItemDelegate(QAbstractItemDelegate * delegate)
このビューとそのモデルのアイテム デリゲートをデリゲートに設定します。これは、項目の編集と表示を完全に制御したい場合に便利です。
このデリゲートは、ファイル名を拡張子なしで表示し、ファイル名の編集を許可します。