1

QFileSystemModel を QTreeView にバインドしました。QFileSystemModel は readOnly を false に設定しているため、ユーザーはファイルの名前を変更できます... ...

名前の変更を機能させたままファイル拡張子を非表示にするにはどうすればよいですか?

ありがとう

4

4 に答える 4

3

再実装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);
}
于 2012-06-01T09:47:23.377 に答える
1

このソリューションは私にとってはうまくいき、拡張機能をユーザーから完全に隠します。

オーバーライドdatasetDataQFileSystemModelクラス内。

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)
于 2020-12-26T04:06:16.853 に答える
0

状況に固有のアイテム デリゲートを作成し、それをビューに関連付ける必要があります。

ここのドキュメントに記載されているように

void QAbstractItemView::setItemDelegate(QAbstractItemDelegate * delegate)

このビューとそのモデルのアイテム デリゲートをデリゲートに設定します。これは、項目の編集と表示を完全に制御したい場合に便利です。

このデリゲートは、ファイル名を拡張子なしで表示し、ファイル名の編集を許可します。

于 2012-05-31T06:26:22.283 に答える