Как изменить значение из QDataWidgetMapper
Поэтому я использую QDataWidgetMapper для сопоставления значений из QSqlQueryModel с виджетами в моем интерфейсе. Это работает хорошо, и каждый раз, когда моя Модель обновляется или обновляется, виджеты тоже обновляются... Отлично!
Но допустим, что у меня есть QLabel... и этот QLabel был сопоставлен с полем в модели под названием "Город", а текст, отображаемый 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_())
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).