2

Qt4のモデル/ビューフレームワークを使用して、「Foo(38バー)」として表示されるアイテムのリストがあります。テキストを編集可能にしたいのですが、ユーザーが編集を開始したときに、コントロールに「Foo」(名前)だけを表示し、編集が完了したときに追加情報「(38バー)」を元に戻したいと思います。

情報を元に戻す方法はわかると思いますが、編集開始時にアイテムのテキストを変更する方法はありますか?

モデルはQStandardItemModelであり、アイテムはQStandardItemのかなり些細なサブクラスです。これらは主にQListViewに表示されます。

UIはPyQtで記述されており、このためだけにC ++に飛び込むのは避けたいと思いますが、C ++ソリューションが表示された場合は、それを翻訳するために最善を尽くします。

4

2 に答える 2

4

@Chris が私を正しい軌道に乗せた後、 QStandardItemのドキュメントで次のメモを見つけました。

デフォルトの実装では、Qt::EditRole と Qt::DisplayRole を同じデータを参照するものとして扱います。

そのため、メソッドをオーバーライドする必要がありましたQStandardItem.data()。私のPythonコードは次のようになりました:

def data(self, role=QtCore.Qt.UserRole+1):
    if role == QtCore.Qt.DisplayRole:
        return "{} ({} bars)".format(self.name, len(self.ds))
    return super().data(role) # Fall back to the default method

モデルのitemChangedシグナルで、使用している .name 属性を更新しました。

def update_name(self):
    self.name = self.data(QtCore.Qt.EditRole)

最後に、「バー」の数は他の場所で変更できます。これにより、ビューがアイテムを更新するようにトリガーされます。それを変更した後、item.emitDataChanged()メソッド(docs)を呼び出しました。

これが完了すると、意図したとおりに機能しているようです。

于 2012-01-09T12:34:55.173 に答える
3

これを実現するには、アイテムに Qt::EditRole データを設定できるはずです。C++ では次のようになります。

myStandareItem->setText( "Foo (38 bars)" );
myStandardItem->setData( Qt::EditRole, "Foo" );

Qt が EditRole で何かを検出すると、テキスト (Qt::DisplayRole に保存されている) の代わりにそれを編集目的で使用します。

その後、 QStandardItemModel::itemChanged() シグナルなどを使用して、アイテムが編集されたときにアイテムの表示テキストを更新できます。

于 2012-01-06T16:01:46.297 に答える