2016-05-04 2 views
2

Я не могу обновить макет QTableView при изменении данных модели. Я попытался с dataChanged.emit (индекс, индекс), с layoutChanged.emit(), а также, в крайнем случае, с reset(). Ничего из этого не получилось. Мой код:QTableView не обновлен на dataChanged

class SettingsDialog(QDialog, settings_design.Ui_settingsDialog): 
    def __init__(self): 
     super(self.__class__, self).__init__() 
     self.setupUi(self) 
     self.weekdayTable = QTableView(self.weekdayPage) 
     weekdayModel = self.loadMeetingData(self.meetingsData['weekdayList']) 
     #weekdayModel.dataChanged.connect(self.updateTable) 
     self.weekdayTable.setModel(weekdayModel) 

    def updateTable(self): 
     self.weekdayTable.repaint() 

class MeetingsModel(QStandardItemModel): 
    def __init__(self, data, columns): 
     QStandardItemModel.__init__(self, data, columns) 
     with open('meetings.config.json') as f: 
      self.meetingsData = json.load(f) 

    def setData(self, index, value, other): 

     self.meetingsData['weekdayList'][int(index.row())][index.column()] = value 
     with open('meetings.config.json', 'w+') as f: 
      f.write(json.dumps(self.meetingsData)) 

     self.dataChanged.emit(index, index) 
     # self.layoutChanged.emit(index, index) 
     return True 

Что я делаю неправильно?

+0

Я смущен. это 'weekdayModel'' MeetingModel'? Также, если вы испускаете с помощью '(index, index)' does not updateTable, необходимо принять эти параметры, являющиеся слотом? –

+0

@busfault Да, weekdayModel - это MeetingModel. Я не понимаю, что вы подразумеваете под «updateTable необходимо принять те параметры, которые являются слотом». Во всяком случае, теоретически, dataChanged.emit должен запускать repaint(),. В этом случае updateTable() не требуется. – sica07

+0

Если вы публикуете [MCVE] (http://stackoverflow.com/help/mcve), который я могу просто скопировать, то я могу помочь дальше. Теперь я могу только дать некоторые общие вещи, которые нужно искать. 1) убедитесь, что на самом деле вызывается 'setData'. 2) убедитесь, что «dataChanged» испускается, подключив его к слоту, который печатает отладочное сообщение. 3) В этом слоте проверьте, что индексы topLeft и bottomRight действительны, и если да, напечатайте их значения строк и столбцов. – titusjan

ответ

1

Я, наконец, решил проблему, взяв другой подход.

Старый подход (элегантный один):

Я продлил setDataметод в соответствии с QStandardModelItem «s с функцией, чтобы сохранить измененные данные в файл.

Новый подход:

Когда dataChangedсигнал испускается QStandarItemModel подключенный слот (writeChangedData) будет записывать измененные данные в файл. Другими словами, я переместил функциональность от setData к слоту.

Код:

class SettingsDialog(QDialog, settings_design.Ui_settingsDialog): 
    def __init__(self): 
     super(self.__class__, self).__init__() 
     self.setupUi(self) 
     self.weekdayTable = QTableView(self.weekdayPage) 
     self.weekdayModel = self.loadMeetingData(self.meetingsData['weekdayList']) 
     self.weekdayModel.dataChanged.connect(self.writeModifiedData) 
     self.weekdayTable.setModel(self.weekdayModel) 

    def writeModifiedData(self, topLeft, bottomRight): 
     self.weekdayModel['weekdayList'][int(topLeft.row())][topLeft.column()] = value 
     with open('meetings.config.json', 'w+') as f: 
      f.write(json.dumps(self.weekdayModel)) 
      f.close() 
Смежные вопросы