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

Vậy ... Làm cách nào để thiết lập đại biểu cho một đơn QDataWidgetMapper? Theo như tôi hiểu không có QDataWidgetMapper.setItemDelegateForColumn() Hoặc tôi có phải tạo một số nhà máy ủy quyền, mà sẽ sử dụng đại biểu thích hợp?QDataWidgetMapper và nhiều đại biểu

Cảm ơn!

Trả lời

3

Bạn phải sử dụng một đại biểu duy nhất và xử lý cách thức hoạt động của các tiện ích khác nhau trong các chức năng setEditorDatasetModelData của đại biểu. Ví dụ (C++ nhưng thẳng về phía trước) kiểm tra this article from Qt Quarterly.

+0

Cảm ơn, tôi đã nhìn thấy bài viết này, nhưng hy vọng cho một cách sắp xếp hợp lý hơn để đạt được nhiệm vụ. Sau khi tất cả, tôi đã có tất cả các đại biểu của tôi cho QTableView với tất cả các chức năng cần thiết. Oh well. Nếu không có cách nào anoter ... – AlexVhr

1

Tôi cũng thấy vấn đề này và nó thực sự rất tệ. Bây giờ tôi đang cố gắng phân lớp QtGui.QDataWidgetMapper để giải quyết vấn đề này, lớp con có addMapping riêng của nó() với một đối số đại biểu, một dict để lưu trữ ủy nhiệm cho mỗi widget và một đại biểu meta phù hợp gọi các ứng dụng ủy nhiệm cho từng trường hợp. Điều lạ lùng nhất về vấn đề này là vấn đề cũng tồn tại trong các phiên bản trước của Qt 4 trong QAbstractItemView (tức là bảng và cây) và sau đó đã được thêm phương thức setItemDelegateForColumn(), nhưng QDataWidgetMapper không sửa lỗi.

Một thay thế có thể được sử dụng nhiều hơn một mapper, và kết nối chúng để giữ cho chúng đồng bộ nếu cần thiết, nhưng nó là một chút lộn xộn, đặc biệt nếu bạn cần rất nhiều đại biểu đặc biệt khác nhau:

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

Có, tôi hết lòng đồng ý với phần 'thực sự hút'. Cảm ơn vì đã cho tôi biết về công việc của bạn. Bạn có một blog hoặc một số nơi khác tôi có thể theo dõi sự tiến bộ? – AlexVhr

3

Ok , Tôi đạt được rồi. (Ít nhất, nó làm việc cho tôi). Vì vậy, ý tưởng chính là lớp này (một phiên bản đơn giản), mà giữ một danh sách các đại biểu thực trường và các tuyến dữ liệu để \ từ họ:

dụ làm việc
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) 

Hoàn toàn là trong pastebin

Các vấn đề liên quan