【问题标题】:How to modify the value from a QDataWidgetMapper如何从 QDataWidgetMapper 修改值
【发布时间】:2017-12-28 00:10:09
【问题描述】:

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

但是假设我有一个 QLabel……并且这个 QLabel 已映射到模型中名为“City”的字段,并且 QLabel 显示的文本显示为“LONDON”。有没有办法格式化这个文本,以便它显示为“伦敦”?同时保持映射关系,不改变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_())

【问题讨论】:

  • 请出示您的代码
  • 您的示例仅显示了一个空小部件。
  • @eyllanesc 是的,我自己对此有点困惑。当我在 QTableView 中查看模型时,该模型似乎可以工作......并且据我所知,映射设置正确。很奇怪!这个例子和我的主要代码的主要区别在于它是从 QSqlQueryModel 映射的。有什么我想念的吗?
  • 放上QSqlQueryModel和QTableView,我想测试一下给你一些选择,但如果我能重现它,我将无法帮助你。

标签: python qt pyqt pyqt4 pyside


【解决方案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 方法)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多