如何修改QDataWidgetMapper中的值

时间:2017-07-21 20:22:28

标签: python qt pyqt pyqt4 pyside

所以我使用QDataWidgetMapper将QSqlQueryModel中的值映射到我界面中的小部件。这很好用,每次我的模型更新或刷新时,小部件也会更新......太棒了!

但是,让我们说我有一个QLabel ......这个QLabel已被映射到Model中的一个名为' City'的字段,以及QLabel显示的文本#39; LONDON&#39 ;.有没有办法格式化这个文本,以便它显示为'伦敦'代替?同时还保持映射关系,而不更改QSqlQueryModel正在查询的数据库?

谢谢!

编辑 - 这是我到目前为止的代码的简化示例:

import sys
from PyQt4 import QtCore, QtGui


class DemoModel(QtCore.QAbstractTableModel):
    def __init__(self):
        super(DemoModel, self).__init__()
        self.visibleColumns = ['city', 'country']
        self.items = [
            {'city': 'LONDON', 'country': 'England'},
            {'city': 'GLASGOW', 'country': 'Scotland'},
            {'city': 'CARDIF', 'country': 'Wales'},
            ]


    def rowCount(self, parent=QtCore.QModelIndex()):
        return len(self.items)


    def columnCount(self, parent=QtCore.QModelIndex()):
        return len(self.visibleColumns)


    def data(self, index, role=QtCore.Qt.DisplayRole):
        if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.ToolTipRole:
            colName = self.visibleColumns[index.column()]
            return self.items[index.row()].get(colName, '')


    def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
        if role == QtCore.Qt.DisplayRole and orientation == QtCore.Qt.Horizontal:
            return self.visibleColumns[section]



class TestWindow(QtGui.QWidget):
    def __init__(self):
        super(TestWindow, self).__init__()
        self.resize(100, 100)
        layout = QtGui.QVBoxLayout(self)

        demoLabel = QtGui.QLabel()
        layout.addWidget(demoLabel)
        mapper.addMapping(demoLabel, 0, "text")



model = DemoModel()
mapper = QtGui.QDataWidgetMapper()
mapper.setModel(model)

app = QtGui.QApplication(sys.argv)
demo =  TestWindow()
demo.show()
sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:1)

您应该在数据映射器上设置项委托,并重新实现setEditorData方法:

class ItemDelegate(QtGui.QItemDelegate):
    def setEditorData(self, editor, index):
        editor.setText(index.data().title())

mapper = QtGui.QDataWidgetMapper()
mapper.setModel(model)
delegate = ItemDelegate()
mapper.setItemDelegate(delegate)

为了使其正常工作,必须在不使用指定属性名称的情况下进行映射

mapper.addMapping(demoLabel, 0)

(请注意,对于可编辑的显示小部件,您可能还需要重新实现setModelData方法。)