2012-04-01 8 views
5
mapper = QtGui.QDataWidgetMapper() 
mapper.setModel(my_table_model) 
mapper.addMapping(widgetA, 0) #mapping widget to a column 
mapper.addMapping(widgetB, 1) #mapping widget to a column 
mapper.setItemDelegate(MyDelegateA(widgetA)) #Hmm. Where is the 'column' parameter? 
mapper.setItemDelegate(MyDelegateB(widgetB)) #now itemDelegate is rewritten, MyDelegateB will be used 

So ... QDataWidgetMapperの単一の代理人を複数設定するにはどうすればよいですか?私が理解する限り、何もありませんQDataWidgetMapper.setItemDelegateForColumn()または適切な代理人を使用するいくつかのデリゲートファクトリを作成する必要がありますか?QDataWidgetMapperと複数の代理人

ありがとうございます!

答えて

3

デリゲートのsetEditorDatasetModelDataの機能で、1つのデリゲートを使用して、異なるウィジェットの動作を処理する必要があります。例(C++しかしまっすぐ進む)の場合、this article from Qt Quarterlyをチェックします。

+0

のおかげであり、私はこの記事を見ても、タスクを達成するためのより合理的な方法が望まれます。結局のところ、私はすでにすべての必要な機能をQTableViewの代理人を得ました。しかたがない。もし誰かの道がなければ... – AlexVhr

1

私もこの問題を発見しました。本当にうんざりです。私は現在、QtGui.QDataWidgetMapperをサブクラス化しようとしています。これは、デリゲート引数付きの独自のaddMapping()、各ウィジェットのデリゲートを格納するサブクラス、および適切なものを呼び出す対応するメタデリゲートを持つサブクラスです。それぞれの場合に代理人。

QUI4の以前のバージョン(テーブルやツリーなど)にも問題があり、その後はsetItemDelegateForColumn()メソッドを追加して修正されましたが、QDataWidgetMapperは修正を取得しませんでした。

代替マッパー以上を使用して、必要に応じて同期でそれらを保つためにそれらを接続するが、それはあなたが別の特別な代表者がたくさん必要な特別な場合には、少し厄介であることができます:

mainMapper = QtGui.QDataWidgetMapper() 
mainMapper.setModel(my_table_model) 

auxMapper1 = QtGui.QDataWidgetMapper() 
auxMapper1.setModel(my_table_model) 

# If you move the index in the main mapper, the auxiliary will follow 
mainMapper.currentIndexChanged.connect(auxMapper1.setCurrentIndex) 

mainMapper.addMapping(widgetA, 0) #mapping widget to a column 
auxMapper1.addMapping(widgetB, 1) #mapping widget to a column 

mainMapper.setItemDelegate(MyDelegateA(widgetA)) 
auxMapper1.setItemDelegate(MyDelegateB(widgetB)) 
+0

はい、私は心から、「本当に吸う」部分に同意します。あなたが働いていることを知らせてくれてありがとう。ブログや他の場所で進捗状況を追跡できますか? – AlexVhr

3

[OK]を、 わかった。 (少なくとも、それは私のために働く)。だから、主なアイデアは、彼らから\に本当のデリゲートインスタンスとルートデータのリストを保持し、このクラス(簡易版)、次のとおりです。

class DelegateProxy(QtGui.QStyledItemDelegate): 

    def __init__(self, delegates, parent=None): 
     QtGui.QStyledItemDelegate.__init__(self, parent) 
     self.delegates = delegates 

    def setEditorData(self, editor, index): 
     delegate = self.delegates[index.column()] 
     delegate.setEditorData(editor, index) 

    def setModelData(self, editor, model, index): 
     delegate = self.delegates[index.column()] 
     delegate.setModelData(editor, model, index) 

完全に動作する例がpastebin