У меня есть графический интерфейс, состоящий из нескольких слайдеров, и вместо того, чтобы обновлять ползунки вручную при изменении базовых данных, я хотел бы сохранить данные в подклассе QAbstractListModel и обновить ползунки. Мой подкласс выглядит следующим образом:Создание интерфейса модели/представления с помощью ползунков с использованием PyQt
from PyQt4 import QtCore
class myDataModel(QtCore.QAbstractListModel):
def __init__(self, initData, parent=None):
super(myDataModel, self).__init__(parent)
self.__data = initData
def data(self, index, role=QtCore.Qt.DisplayRole):
if not index.isValid():
return None
if index.row() > len(self.__data):
return None
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
return self.__data[index.row()]
return None
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.__data)
def setData(self, index, value, role=QtCore.Qt.EditRole):
if not index.isValid() or role != QtCore.Qt.EditRole:
return False
self.__data[index.row()] = value
self.dataChanged.emit(index, index)
return True
Как я могу подключить эту модель к ползункам в моей GUI, так что, когда данные в модели изменяются, ползунки изменятся, и наоборот?
Edit: Вот макет основного интерфейса я работал на:
Edit: я до сих пор не удалось получить эту работу. Вот моя модель класса:
class dataModel(QtCore.QAbstractListModel):
def __init__(self, initData, parent=None):
super(dataModel, self).__init__(parent)
self.__data = initData
def data(self, index, role=QtCore.Qt.DisplayRole):
if not index.isValid():
return None
if index.row() > len(self.__data):
return None
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
return self.__data[index.row()]
return None
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.__data)
def setData(self, index, value, role=QtCore.Qt.EditRole):
if not index.isValid() or role != QtCore.Qt.EditRole:
return False
self.__data[index.row()] = value
self.dataChanged.emit(index, index)
return True
Вот класс делегата:
class sliderDelegate(QtGui.QItemDelegate):
'''
classdocs
'''
def __init__(self, parent=None):
'''
Constructor
'''
super(sliderDelegate, self).__init__(parent)
def setEditorData(self, editor, index):
editor.setValue(index.model().data(index, QtCore.Qt.EditRole))
def setModelData(self, editor, model, index):
model.setData(index, editor.value(), QtCore.Qt.EditRole)
А вот код установки:
self._model = dataModel([0 for i in xrange(20)])
self._parameterMapper = QtGui.QDataWidgetMapper(mainWindowInstance)
self._parameterMapper.setModel(self._model)
self._parameterMapper.setItemDelegate(sliderDelegate(mainWindowInstance))
self._parameterMapper.addMapping(self._mainWindowInstance.ui.mySlider, 0)
self._parameterMapper.toFirst()
К сожалению, я получаю следующее сообщение об ошибке при toFirst() называется:
editor.setValue(index.model().data(index, QtCore.Qt.EditRole))
AttributeError: 'NoneType' object has no attribute 'data'
Любая помощь будет оценена по достоинству.
Можете ли вы представить макет того, как вы хотите, чтобы этот интерфейс выглядел (например, в QtDesigner)? Кроме того, существует ли переменное количество точек данных (и, следовательно, ползунков) или оно фиксировано? –
@LegoStormtroopr Я добавил макет, над которым я работал в QtDesigner. Количество слайдеров будет зафиксировано в приложении, их всего лишь много. Честно говоря, я хотел бы иметь возможность хранить все настройки виджета в приложении в модели, а также иметь обновления comboboxes и т. Д., Когда модель также будет изменена, но получение всех рабочих слайдеров будет хорошим началом и, надеюсь, позвольте мне экстраполировать метод на другие виджеты. – Bitrex
К сожалению, QAbstractListModel лучше всего использовать в качестве данных списка, которые представлены в виде списка. Может быть проще сделать несколько пользовательских виджетов (например, группировать 6 ползунков слева и другую группу для 8 справа с помощью комбо), а затем продвигать их в QtDesigner и писать собственный код для продвигаемых классов? –