#!/usr/bin/env python """PyQt4 port of the tools/settingseditor example from Qt v4.x""" import sys from PyQt4 import QtCore, QtGui class MainWindow(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.settingsTree = SettingsTree() self.setCentralWidget(self.settingsTree) self.locationDialog = None self.createActions() self.createMenus() self.autoRefreshAct.setChecked(True) self.fallbacksAct.setChecked(True) self.setWindowTitle(self.tr("Settings Editor")) self.resize(500, 600) def openSettings(self): if self.locationDialog is None: self.locationDialog = LocationDialog(self) if self.locationDialog.exec_(): settings = QtCore.QSettings(self.locationDialog.format(), self.locationDialog.scope(), self.locationDialog.organization(), self.locationDialog.application()) self.setSettingsObject(settings) self.fallbacksAct.setEnabled(True) def openIniFile(self): fileName = QtGui.QFileDialog.getOpenFileName(self, self.tr("Open INI File"), "", self.tr("INI Files(*.ini *.conf)")) if not fileName.isEmpty(): settings = QtCore.QSettings(fileName, QtCore.QSettings.IniFormat) self.setSettingsObject(settings) self.fallbacksAct.setEnabled(False) def openPropertyList(self): fileName = QtGui.QFileDialog.getOpenFileName(self, self.tr("Open Property List"), "", self.tr("Property List Files(*.plist)")) if not fileName.isEmpty(): settings = QtCore.QSettings(fileName, QtCore.QSettings.NativeFormat) self.setSettingsObject(settings) self.fallbacksAct.setEnabled(False) def openRegistryPath(self): path = QtGui.QInputDialog.getText(self, self.tr("Open Registry Path"), self.tr("Enter the path in the Windows registry:"), QtGui.QLineEdit.Normal, "HKEY_CURRENT_USER\\") if not path.isEmpty(): settings = QtCore.QSettings(path, QtCore.QSettings.NativeFormat) self.setSettingsObject(settings) self.fallbacksAct.setEnabled(False) def about(self): QtGui.QMessageBox.about(self, self.tr("About Settings Editor"), self.tr( "The Settings Editor example shows how to " "access application settings using Qt.")) def createActions(self): self.openSettingsAct = QtGui.QAction(self.tr("&Open Application Settings..."), self) self.openSettingsAct.setShortcut(self.tr("Ctrl+O")) self.connect(self.openSettingsAct, QtCore.SIGNAL("triggered()"), self.openSettings) self.openIniFileAct = QtGui.QAction(self.tr("Open I&NI File..."), self) self.openIniFileAct.setShortcut(self.tr("Ctrl+N")) self.connect(self.openIniFileAct, QtCore.SIGNAL("triggered()"), self.openIniFile) self.openPropertyListAct = QtGui.QAction(self.tr("Open Mac &Property List..."), self) self.openPropertyListAct.setShortcut(self.tr("Ctrl+P")) self.connect(self.openPropertyListAct, QtCore.SIGNAL("triggered()"), self.openPropertyList) if sys.platform != 'mac': self.openPropertyListAct.setEnabled(False) self.openRegistryPathAct = QtGui.QAction(self.tr("Open Windows &Registry Path..."), self) self.openRegistryPathAct.setShortcut(self.tr("Ctrl+G")) self.connect(self.openRegistryPathAct, QtCore.SIGNAL("triggered()"), self.openRegistryPath) if sys.platform != 'win32': self.openRegistryPathAct.setEnabled(False) self.refreshAct = QtGui.QAction(self.tr("&Refresh"), self) self.refreshAct.setShortcut(self.tr("Ctrl+R")) self.refreshAct.setEnabled(False) self.connect(self.refreshAct, QtCore.SIGNAL("triggered()"), self.settingsTree.refresh) self.exitAct = QtGui.QAction(self.tr("E&xit"), self) self.exitAct.setShortcut(self.tr("Ctrl+Q")) self.connect(self.exitAct, QtCore.SIGNAL("triggered()"), self, QtCore.SLOT("close()")) self.autoRefreshAct = QtGui.QAction(self.tr("&Auto-Refresh"), self) self.autoRefreshAct.setShortcut(self.tr("Ctrl+A")) self.autoRefreshAct.setCheckable(True) self.autoRefreshAct.setEnabled(False) self.connect(self.autoRefreshAct, QtCore.SIGNAL("triggered(bool)"), self.settingsTree.setAutoRefresh) self.connect(self.autoRefreshAct, QtCore.SIGNAL("triggered(bool)"), self.refreshAct, QtCore.SLOT("setDisabled(bool)")) self.fallbacksAct = QtGui.QAction(self.tr("&Fallbacks"), self) self.fallbacksAct.setShortcut(self.tr("Ctrl+F")) self.fallbacksAct.setCheckable(True) self.fallbacksAct.setEnabled(False) self.connect(self.fallbacksAct, QtCore.SIGNAL("triggered(bool)"), self.settingsTree.setFallbacksEnabled) self.aboutAct = QtGui.QAction(self.tr("&About"), self) self.connect(self.aboutAct, QtCore.SIGNAL("triggered()"), self.about) self.aboutQtAct = QtGui.QAction(self.tr("About &Qt"), self) self.connect(self.aboutQtAct, QtCore.SIGNAL("triggered()"), QtGui.qApp, QtCore.SLOT("aboutQt()")) def createMenus(self): self.fileMenu = self.menuBar().addMenu(self.tr("&File")) self.fileMenu.addAction(self.openSettingsAct) self.fileMenu.addAction(self.openIniFileAct) self.fileMenu.addAction(self.openPropertyListAct) self.fileMenu.addAction(self.openRegistryPathAct) self.fileMenu.addSeparator() self.fileMenu.addAction(self.refreshAct) self.fileMenu.addSeparator() self.fileMenu.addAction(self.exitAct) self.optionsMenu = self.menuBar().addMenu(self.tr("&Options")) self.optionsMenu.addAction(self.autoRefreshAct) self.optionsMenu.addAction(self.fallbacksAct) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu(self.tr("&Help")) self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def setSettingsObject(self, settings): settings.setFallbacksEnabled(self.fallbacksAct.isChecked()) self.settingsTree.setSettingsObject(settings) self.refreshAct.setEnabled(True) self.autoRefreshAct.setEnabled(True) niceName = settings.fileName() niceName.replace("\\", "/") pos = niceName.lastIndexOf("/") if pos != -1: niceName.remove(0, pos + 1) if not settings.isWritable(): niceName = self.tr("%1(read only)").arg(niceName) self.setWindowTitle(self.tr("%1 - %2") .arg(niceName).arg(self.tr("Settings Editor"))) class LocationDialog(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.formatComboBox = QtGui.QComboBox() self.formatComboBox.addItem(self.tr("Native")) self.formatComboBox.addItem(self.tr("INI")) self.scopeComboBox = QtGui.QComboBox() self.scopeComboBox.addItem(self.tr("User")) self.scopeComboBox.addItem(self.tr("System")) self.organizationComboBox = QtGui.QComboBox() self.organizationComboBox.addItem(self.tr("Trolltech")) self.organizationComboBox.setEditable(True) self.applicationComboBox = QtGui.QComboBox() self.applicationComboBox.addItem(self.tr("Any")) self.applicationComboBox.addItem(self.tr("Application Example")) self.applicationComboBox.addItem(self.tr("Assistant")) self.applicationComboBox.addItem(self.tr("Designer")) self.applicationComboBox.addItem(self.tr("Linguist")) self.applicationComboBox.setEditable(True) self.applicationComboBox.setCurrentIndex(3) self.formatLabel = QtGui.QLabel(self.tr("&Format:")) self.formatLabel.setBuddy(self.formatComboBox) self.scopeLabel = QtGui.QLabel(self.tr("&Scope:")) self.scopeLabel.setBuddy(self.scopeComboBox) self.organizationLabel = QtGui.QLabel(self.tr("&Organization:")) self.organizationLabel.setBuddy(self.organizationComboBox) self.applicationLabel = QtGui.QLabel(self.tr("&Application:")) self.applicationLabel.setBuddy(self.applicationComboBox) self.locationsGroupBox = QtGui.QGroupBox(self.tr("Setting Locations")) labels = QtCore.QStringList() labels << self.tr("Location") << self.tr("Access") self.locationsTable = QtGui.QTableWidget() self.locationsTable.setSelectionMode(QtGui.QAbstractItemView.NoSelection) self.locationsTable.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.locationsTable.setColumnCount(2) self.locationsTable.setHorizontalHeaderLabels(labels) self.locationsTable.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Stretch) self.locationsTable.horizontalHeader().resizeSection(1, 180) self.okButton = QtGui.QPushButton(self.tr("OK")) self.cancelButton = QtGui.QPushButton(self.tr("Cancel")) self.okButton.setDefault(True) self.connect(self.formatComboBox, QtCore.SIGNAL("activated(int)"), self.updateLocationsTable) self.connect(self.scopeComboBox, QtCore.SIGNAL("activated(int)"), self.updateLocationsTable) self.connect(self.organizationComboBox, QtCore.SIGNAL("editTextChanged(const QString &)"), self.updateLocationsTable) self.connect(self.applicationComboBox, QtCore.SIGNAL("editTextChanged(const QString &)"), self.updateLocationsTable) self.connect(self.okButton, QtCore.SIGNAL("clicked()"), self, QtCore.SLOT("accept()")) self.connect(self.cancelButton, QtCore.SIGNAL("clicked()"), self, QtCore.SLOT("reject()")) locationsLayout = QtGui.QVBoxLayout() locationsLayout.addWidget(self.locationsTable) self.locationsGroupBox.setLayout(locationsLayout) buttonLayout = QtGui.QHBoxLayout() buttonLayout.addStretch(1) buttonLayout.addWidget(self.okButton) buttonLayout.addWidget(self.cancelButton) mainLayout = QtGui.QGridLayout() mainLayout.addWidget(self.formatLabel, 0, 0) mainLayout.addWidget(self.formatComboBox, 0, 1) mainLayout.addWidget(self.scopeLabel, 1, 0) mainLayout.addWidget(self.scopeComboBox, 1, 1) mainLayout.addWidget(self.organizationLabel, 2, 0) mainLayout.addWidget(self.organizationComboBox, 2, 1) mainLayout.addWidget(self.applicationLabel, 3, 0) mainLayout.addWidget(self.applicationComboBox, 3, 1) mainLayout.addWidget(self.locationsGroupBox, 4, 0, 1, 2) mainLayout.addLayout(buttonLayout, 5, 0, 1, 2) self.setLayout(mainLayout) self.updateLocationsTable() self.setWindowTitle(self.tr("Open Application Settings")) self.resize(650, 400) def format(self): if self.formatComboBox.currentIndex() == 0: return QtCore.QSettings.NativeFormat else: return QtCore.QSettings.IniFormat def scope(self): if self.scopeComboBox.currentIndex() == 0: return QtCore.QSettings.UserScope else: return QtCore.QSettings.SystemScope def organization(self): return self.organizationComboBox.currentText() def application(self): if self.applicationComboBox.currentText() == self.tr("Any"): return QtCore.QString("") else: return self.applicationComboBox.currentText() def updateLocationsTable(self): self.locationsTable.setUpdatesEnabled(False) self.locationsTable.setRowCount(0) for i in range(2): if i == 0: if self.scope() == QtCore.QSettings.SystemScope: continue actualScope = QtCore.QSettings.UserScope else: actualScope = QtCore.QSettings.SystemScope for j in range(2): if j == 0: if self.application().isEmpty(): continue actualApplication = self.application() else: actualApplication = QtCore.QString() settings = QtCore.QSettings(self.format(), actualScope, self.organization(), actualApplication) row = self.locationsTable.rowCount() self.locationsTable.setRowCount(row + 1) headerItem = QtGui.QTableWidgetItem() headerItem.setText(QtCore.QString.number(row + 1)) item0 = QtGui.QTableWidgetItem() item0.setText(settings.fileName()) item1 = QtGui.QTableWidgetItem() disable = (settings.childKeys().isEmpty() and settings.childGroups().isEmpty()) if row == 0: if settings.isWritable(): item1.setText(self.tr("Read-write")) disable = False else: item1.setText(self.tr("Read-only")) self.okButton.setDisabled(disable) else: item1.setText(self.tr("Read-only fallback")) if disable: item0.setFlags(item0.flags() & ~QtCore.Qt.ItemIsEnabled) item1.setFlags(item1.flags() & ~QtCore.Qt.ItemIsEnabled) self.locationsTable.setVerticalHeaderItem(row, headerItem) self.locationsTable.setItem(row, 0, item0) self.locationsTable.setItem(row, 1, item1) self.locationsTable.setUpdatesEnabled(True) class SettingsTree(QtGui.QTreeWidget): def __init__(self, parent=None): QtGui.QTreeWidget.__init__(self, parent) self.setItemDelegate(VariantDelegate(self)) labels = QtCore.QStringList() labels << self.tr("Setting") << self.tr("Type") << self.tr("Value") self.setHeaderLabels(labels) self.header().setResizeMode(0, QtGui.QHeaderView.Stretch) self.header().setResizeMode(2, QtGui.QHeaderView.Stretch) self.settings = None self.refreshTimer = QtCore.QTimer() self.refreshTimer.setInterval(2000) self.autoRefresh = False self.groupIcon = QtGui.QIcon() self.groupIcon.addPixmap(self.style().standardPixmap(QtGui.QStyle.SP_DirClosedIcon), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.groupIcon.addPixmap(self.style().standardPixmap(QtGui.QStyle.SP_DirOpenIcon), QtGui.QIcon.Normal, QtGui.QIcon.On) self.keyIcon = QtGui.QIcon() self.keyIcon.addPixmap(self.style().standardPixmap(QtGui.QStyle.SP_FileIcon)) self.connect(self.refreshTimer, QtCore.SIGNAL("timeout()"), self.maybeRefresh) def setSettingsObject(self, settings): self.settings = settings self.clear() if self.settings is not None: self.settings.setParent(self) self.refresh() if self.autoRefresh: self.refreshTimer.start() else: self.refreshTimer.stop() def sizeHint(self): return QtCore.QSize(800, 600) def setAutoRefresh(self, autoRefresh): self.autoRefresh = autoRefresh if self.settings is not None: if self.autoRefresh: self.maybeRefresh() self.refreshTimer.start() else: self.refreshTimer.stop() def setFallbacksEnabled(self, enabled): if self.settings is not None: self.settings.setFallbacksEnabled(enabled) self.refresh() def maybeRefresh(self): if self.state() != QtGui.QAbstractItemView.EditingState: self.refresh() def refresh(self): if self.settings is None: return self.disconnect(self, QtCore.SIGNAL("itemChanged(QTreeWidgetItem *, int)"), self.updateSetting) self.settings.sync() self.updateChildItems(None) self.connect(self, QtCore.SIGNAL("itemChanged(QTreeWidgetItem *, int)"), self.updateSetting) def event(self, event): if event.type() == QtCore.QEvent.WindowActivate: if self.isActiveWindow() and self.autoRefresh: self.maybeRefresh() return QtGui.QTreeWidget.event(self, event) def updateSetting(self, item): key = item.text(0) ancestor = item.parent() while ancestor: key.prepend(ancestor.text(0) + "/") ancestor = ancestor.parent() self.settings.setValue(key, item.data(2, QtCore.Qt.UserRole)) if self.autoRefresh: self.refresh() def updateChildItems(self, parent): dividerIndex = 0 for group in self.settings.childGroups(): childIndex = self.findChild(parent, group, dividerIndex) if childIndex != -1: child = self.childAt(parent, childIndex) child.setText(1, "") child.setText(2, "") child.setData(2, QtCore.Qt.UserRole, QtCore.QVariant()) self.moveItemForward(parent, childIndex, dividerIndex) else: child = self.createItem(group, parent, dividerIndex) child.setIcon(0, self.groupIcon) dividerIndex += 1 self.settings.beginGroup(group) self.updateChildItems(child) self.settings.endGroup() for key in self.settings.childKeys(): childIndex = self.findChild(parent, key, 0) if childIndex == -1 or childIndex >= dividerIndex: if childIndex != -1: child = self.childAt(parent, childIndex) for i in range(child.childCount()): self.deleteItem(child, i) self.moveItemForward(parent, childIndex, dividerIndex) else: child = self.createItem(key, parent, dividerIndex) child.setIcon(0, self.keyIcon) dividerIndex += 1 else: child = self.childAt(parent, childIndex) value = self.settings.value(key) if value.type() == QtCore.QVariant.Invalid: child.setText(1, "Invalid") else: child.setText(1, value.typeName()) child.setText(2, VariantDelegate.displayText(value)) child.setData(2, QtCore.Qt.UserRole, value) while dividerIndex < self.childCount(parent): self.deleteItem(parent, dividerIndex) def createItem(self, text, parent, index): after = None if index != 0: after = self.childAt(parent, index - 1) if parent is not None: item = QtGui.QTreeWidgetItem(parent, after) else: item = QtGui.QTreeWidgetItem(self, after) item.setText(0, text) item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable) return item def deleteItem(self, parent, index): if parent is not None: item = parent.takeChild(index) else: item = self.takeTopLevelItem(index) del item def childAt(self, parent, index): if parent is not None: return parent.child(index) else: return self.topLevelItem(index) def childCount(self, parent): if parent is not None: return parent.childCount() else: return self.topLevelItemCount() def findChild(self, parent, text, startIndex): for i in range(self.childCount(parent)): if self.childAt(parent, i).text(0) == text: return i return -1 def moveItemForward(self, parent, oldIndex, newIndex): for int in range(oldIndex - newIndex): self.deleteItem(parent, newIndex) class VariantDelegate(QtGui.QItemDelegate): def __init__(self, parent=None): QtGui.QItemDelegate.__init__(self, parent) self.boolExp = QtCore.QRegExp() self.boolExp.setPattern("true|false") self.boolExp.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.byteArrayExp = QtCore.QRegExp() self.byteArrayExp.setPattern("[\\x00-\\xff]*") self.charExp = QtCore.QRegExp() self.charExp.setPattern(".") self.colorExp = QtCore.QRegExp() self.colorExp.setPattern("\\(([0-9]*),([0-9]*),([0-9]*),([0-9]*)\\)") self.doubleExp = QtCore.QRegExp() self.doubleExp.setPattern("") self.pointExp = QtCore.QRegExp() self.pointExp.setPattern("\\((-?[0-9]*),(-?[0-9]*)\\)") self.rectExp = QtCore.QRegExp() self.rectExp.setPattern("\\((-?[0-9]*),(-?[0-9]*),(-?[0-9]*),(-?[0-9]*)\\)") self.signedIntegerExp = QtCore.QRegExp() self.signedIntegerExp.setPattern("-?[0-9]*") self.sizeExp = QtCore.QRegExp() self.sizeExp = self.pointExp self.unsignedIntegerExp = QtCore.QRegExp() self.unsignedIntegerExp.setPattern("[0-9]*") self.dateExp = QtCore.QRegExp() self.dateExp.setPattern("([0-9],4)-([0-9],2)-([0-9],2)") self.timeExp = QtCore.QRegExp() self.timeExp.setPattern("([0-9],2):([0-9],2):([0-9],2)") self.dateTimeExp = QtCore.QRegExp() self.dateTimeExp.setPattern(self.dateExp.pattern() + "T" + self.timeExp.pattern()) def paint(self, painter, option, index): if index.column() == 2: value = index.model().data(index, QtCore.Qt.UserRole) if not self.isSupportedType(value.type()): myOption = QtGui.QStyleOptionViewItem(option) myOption.state &= ~QtGui.QStyle.State_Enabled QtGui.QItemDelegate.paint(self, painter, myOption, index) return QtGui.QItemDelegate.paint(self, painter, option, index) def createEditor(self, parent, option, index): if index.column() != 2: return None originalValue = index.model().data(index, QtCore.Qt.UserRole) if not self.isSupportedType(originalValue.type()): return None lineEdit = QtGui.QLineEdit(parent) lineEdit.setFrame(False) valueType = originalValue.type() if valueType == QtCore.QVariant.Bool: regExp = self.boolExp elif valueType == QtCore.QVariant.ByteArray: regExp = self.byteArrayExp elif valueType == QtCore.QVariant.Char: regExp = self.charExp elif valueType == QtCore.QVariant.Color: regExp = self.colorExp elif valueType == QtCore.QVariant.Date: regExp = self.dateExp elif valueType == QtCore.QVariant.DateTime: regExp = self.dateTimeExp elif valueType == QtCore.QVariant.Double: regExp = self.doubleExp elif valueType in (QtCore.QVariant.Int, QtCore.QVariant.LongLong): regExp = self.signedIntegerExp elif valueType == QtCore.QVariant.Point: regExp = self.pointExp elif valueType == QtCore.QVariant.Rect: regExp = self.rectExp elif valueType == QtCore.QVariant.Size: regExp = self.sizeExp elif valueType == QtCore.QVariant.Time: regExp = self.timeExp elif valueType in (QtCore.QVariant.UInt, QtCore.QVariant.ULongLong): regExp = self.unsignedIntegerExp else: regExp = QtCore.QRegExp() if not regExp.isEmpty(): validator = QtGui.QRegExpValidator(regExp, lineEdit) lineEdit.setValidator(validator) self.connect(lineEdit, QtCore.SIGNAL("returnPressed()"), self.commitAndCloseEditor) return lineEdit def setEditorData(self, editor, index): value = index.model().data(index, QtCore.Qt.UserRole) if editor is not None: editor.setText(self.displayText(value)) def setModelData(self, editor, model, index): if not editor.isModified(): return text = QtCore.QString(editor.text()) validator = editor.validator() if validator is not None: state, pos = validator.validate(text, 0) if state != QtGui.QValidator.Acceptable: return originalValue = index.model().data(index, QtCore.Qt.UserRole) valueType = originalValue.type() if valueType == QtCore.QVariant.Char: value = QtCore.QVariant(text.at(0)) elif valueType == QtCore.QVariant.Color: self.colorExp.exactMatch(text) value = QtCore.QVariant(QtGui.QColor(min(self.colorExp.cap(1).toInt(), 255), min(self.colorExp.cap(2).toInt(), 255), min(self.colorExp.cap(3).toInt(), 255), min(self.colorExp.cap(4).toInt(), 255))) elif valueType == QtCore.QVariant.Date: date = QtCore.QDate.fromString(text, QtCore.Qt.ISODate) if not date.isValid(): return value = QtCore.QVariant(date) elif valueType == QtCore.QVariant.DateTime: dateTime = QtCore.QDateTime.fromString(text, QtCore.Qt.ISODate) if not dateTime.isValid(): return value = QtCore.QVariant(dateTime) elif valueType == QtCore.QVariant.Point: self.pointExp.exactMatch(text) value = QtCore.QVariant(QtCore.QPoint(self.pointExp.cap(1).toInt(), self.pointExp.cap(2).toInt())) elif valueType == QtCore.QVariant.Rect: self.rectExp.exactMatch(text) value = QtCore.QVariant(QtCore.QRect(self.rectExp.cap(1).toInt(), self.rectExp.cap(2).toInt(), self.rectExp.cap(3).toInt(), self.rectExp.cap(4).toInt())) elif valueType == QtCore.QVariant.Size: self.sizeExp.exactMatch(text) value = QtCore.QVariant(QtCore.QSize(self.sizeExp.cap(1).toInt(), self.sizeExp.cap(2).toInt())) elif valueType == QtCore.QVariant.StringList: value = QtCore.QVariant(text.split(",")) elif valueType == QtCore.QVariant.Time: time = QtCore.QTime.fromString(text, QtCore.Qt.ISODate) if not time.isValid(): return value = QtCore.QVariant(time) else: value = QtCore.QVariant(text) value.convert(originalValue.type()) model.setData(index, QtCore.QVariant(self.displayText(value)), QtCore.Qt.DisplayRole) model.setData(index, value, QtCore.Qt.UserRole) def isSupportedType(valueType): if valueType == QtCore.QVariant.Bool: return True elif valueType == QtCore.QVariant.ByteArray: return True elif valueType == QtCore.QVariant.Char: return True elif valueType == QtCore.QVariant.Color: return True elif valueType == QtCore.QVariant.Date: return True elif valueType == QtCore.QVariant.DateTime: return True elif valueType == QtCore.QVariant.Double: return True elif valueType == QtCore.QVariant.Int: return True elif valueType == QtCore.QVariant.LongLong: return True elif valueType == QtCore.QVariant.Point: return True elif valueType == QtCore.QVariant.Rect: return True elif valueType == QtCore.QVariant.Size: return True elif valueType == QtCore.QVariant.String: return True elif valueType == QtCore.QVariant.StringList: return True elif valueType == QtCore.QVariant.Time: return True elif valueType == QtCore.QVariant.UInt: return True elif valueType == QtCore.QVariant.ULongLong: return True else: return False isSupportedType = staticmethod(isSupportedType) def displayText(value): valueType = value.type() if valueType == QtCore.QVariant.Bool: return value.toString() elif valueType == QtCore.QVariant.ByteArray: return value.toString() elif valueType == QtCore.QVariant.Char: return value.toString() elif valueType == QtCore.QVariant.Double: return value.toString() elif valueType == QtCore.QVariant.Int: return value.toString() elif valueType == QtCore.QVariant.LongLong: return value.toString() elif valueType == QtCore.QVariant.String: return value.toString() elif valueType == QtCore.QVariant.UInt: return value.toString() elif valueType == QtCore.QVariant.ULongLong: return value.toString() elif valueType == QtCore.QVariant.Color: color = QColor(value) return (QtCore.QString("(%1,%2,%3,%4)") .arg(color.red()).arg(color.green()) .arg(color.blue()).arg(color.alpha())) elif valueType == QtCore.QVariant.Date: return value.toDate().toString(QtCore.Qt.ISODate) elif valueType == QtCore.QVariant.DateTime: return value.toDateTime().toString(QtCore.Qt.ISODate) elif valueType == QtCore.QVariant.Invalid: return "" elif valueType == QtCore.QVariant.Point: point = value.toPoint() return QtCore.QString("(%1,%2)").arg(point.x()).arg(point.y()) elif valueType == QtCore.QVariant.Rect: rect = value.toRect() return (QtCore.QString("(%1,%2,%3,%4)") .arg(rect.x()).arg(rect.y()) .arg(rect.width()).arg(rect.height())) elif valueType == QtCore.QVariant.Size: size = value.toSize() return QtCore.QString("(%1,%2)").arg(size.width()).arg(size.height()) elif valueType == QtCore.QVariant.StringList: return value.toStringList().join(",") elif valueType == QtCore.QVariant.Time: return value.toTime().toString(QtCore.Qt.ISODate) return QtCore.QString("<%1>").arg(value.typeName()) displayText = staticmethod(displayText) def commitAndCloseEditor(self): editor = self.sender() self.emit(QtCore.SIGNAL("commitData(QWidget *)"), editor) self.emit(QtCore.SIGNAL("closeEditor(QWidget *)"), editor) if __name__ == '__main__': app = QtGui.QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_())