Tôi có GUI bao gồm một số thanh trượt và thay vì cập nhật thanh trượt theo cách thủ công khi dữ liệu cơ bản thay đổi, tôi muốn lưu trữ dữ liệu trong phân lớp QAbstractListModel và có các vị trí thanh trượt cập nhật tự động. lớp con của tôi trông như thế này:Tạo giao diện model/view với thanh trượt bằng 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
Làm thế nào tôi có thể kết nối mô hình này để các thanh trượt trong GUI của tôi vì vậy mà khi dữ liệu trong mô hình được thay đổi, các thanh trượt thay đổi, và ngược lại?
Edit: Đây là một mockup của giao diện cơ bản tôi đã làm việc trên:
Edit: Tôi vẫn chưa thể có được điều này để làm việc. Đây là mô hình lớp học của tôi:
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
đây là lớp đại biểu:
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)
Và đây là đoạn code thiết lập:
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()
Đáng tiếc là tôi nhận được lỗi sau khi toFirst() được gọi là:
editor.setValue(index.model().data(index, QtCore.Qt.EditRole))
AttributeError: 'NoneType' object has no attribute 'data'
Bất kỳ trợ giúp nào sẽ được đánh giá cao.
Bạn có thể cung cấp mô hình về cách bạn muốn giao diện này trông như thế nào (ví dụ: trong QtDesigner) không? Ngoài ra, có một số điểm dữ liệu biến (và do đó trượt) hoặc là nó cố định? –
@LegoStormtroopr Tôi đã thêm mockup mà tôi đã làm việc trên QtDesigner. Số lượng thanh trượt sẽ được cố định trong ứng dụng, chỉ có một LOT của chúng. Thành thật mà nói, tôi muốn có thể lưu trữ tất cả các thiết lập widget trong ứng dụng trong một mô hình, và có comboboxes, vv cập nhật khi mô hình được thay đổi, nhưng nhận được tất cả các thanh trượt làm việc sẽ là một khởi đầu tốt và hy vọng hãy để tôi ngoại suy phương pháp cho các tiện ích khác. – Bitrex
Thật không may, QAbstractListModel được sử dụng tốt nhất làm dữ liệu danh sách được trình bày dưới dạng danh sách. Nó có thể dễ dàng hơn để tạo một vài widget tùy chỉnh (ví dụ, nhóm 6 thanh trượt bên trái và một nhóm khác cho 8 bên phải với combo), sau đó quảng bá chúng trong QtDesigner và viết mã tùy chỉnh cho các lớp được quảng bá? –