2012-04-01 2 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 

단일 ... QDataWidgetMapper에 대해 복수 대리자를 설정하려면 어떻게해야합니까? 내가 아는 한은 QDataWidgetMapper.setItemDelegateForColumn()입니다. 아니면 적절한 대리인을 사용할 일부 대리인 팩터 리를 만들어야합니까?QDataWidgetMapper 및 여러 대리자

감사합니다.

답변

3

위임자의 setEditorDatasetModelData 함수에서 하나의 단일 위임자를 사용하고 다른 위젯의 동작을 처리해야합니다. 예를 들어 (C++하지만 곧장 앞으로) this article from Qt Quarterly을 확인하십시오.

+0

덕분에 내가 : 그래서, 주요 아이디어는 그들로부터 \에 실제 위임 인스턴스 및 경로 데이터의 목록을 유지이 클래스 (단순화 된 버전)입니다 이 기사를 보았으나보다 능률적 인 방법으로 작업을 수행하기를 희망했습니다. 결국, 나는 필요한 모든 기능을 갖춘 QTableView에 대한 나의 대표자를 이미 확보했다. 오 잘. anoter way가 없다면 ... – AlexVhr

1

이 문제도 발견되어 정말 짜증납니다. 지금 당장은 QtGui.QDataWidgetMapper를 하위 클래스로 만들려고합니다. 하위 클래스는 위임 인수가있는 자체 addMapping(), 각 위젯의 위임을 저장하는 dict 및 해당 위임을 호출하는 일치하는 메타 대리자를가집니다. 각 사례에 대해 위임합니다.

가장 이상한 점은 이전 버전의 QA 4 (QAbstractItemView, 즉 테이블과 트리)에도 존재했으며 나중에 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

확인을 , 알았다. (적어도, 그것은 나를 위해 일한다).

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