【问题标题】:QDataWidgetMapper and multiple delegatesQDataWidgetMapper 和多个委托
【发布时间】:2012-04-01 21:04:01
【问题描述】:
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() 或者我必须创建一些委托工厂,它将使用适当的委托?

谢谢!

【问题讨论】:

    标签: qt pyqt pyside


    【解决方案1】:

    您必须使用单个委托并处理委托的setEditorDatasetModelData 函数中不同小部件的方式行为。举个例子(C++,但直截了当)检查this article from Qt Quarterly

    【讨论】:

    • 谢谢,我看过这篇文章,但希望有一种更精简的方式来完成任务。毕竟,我已经为 QTableView 提供了所有需要的功能。那好吧。如果没有其他方法...
    【解决方案2】:

    好的,我明白了。 (至少,它对我有用)。因此,主要思想是这个类(一个简化版本),它保留了一个真实委托实例的列表并将数据路由到它们:

    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

    【讨论】:

      【解决方案3】:

      我也发现了这个问题,真的很糟糕。我现在正在尝试将 QtGui.QDataWidgetMapper 子类化以解决此问题,子类具有自己的 addMapping() 和委托参数,用于存储每个小部件的委托的字典,以及调用适当的匹配元委托每个案例的委托。

      最奇怪的是这个问题也存在于早期版本的 Qt 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))
      

      【讨论】:

      • 是的,我完全同意“非常糟糕”的部分。谢谢你让我知道你的工作。您有博客或其他可以跟踪进度的地方吗?
      猜你喜欢
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多