beginResetModel() — не работает

#python #linux #pyqt

#python #linux #pyqt

Вопрос:

Когда скрипт запущен, я изменяю содержимое файла. На centos у меня такая ошибка:

Ошибка атрибута: объект ‘list’ не имеет атрибута ‘beginResetModel’

В Ubuntu у меня нет никакой ошибки, но srcipt не перезагружает данные. Может ли это быть связано с beginResetModel в этом случае?

 class StockListModel(QtCore.QAbstractListModel):
        def __init__(self, stockdata = [], parent = None):
            QtCore.QAbstractListModel.__init__(self, parent)
            self.stockdata = stockdata
            self.file_check = QtCore.QFileSystemWatcher(['/home/user/Desktop/file.txt'])
            self.file_check.fileChanged.connect(self.resetItems)

        def getItems(self):
           return self.stockdata

        @QtCore.pyqtSlot(str)
        def resetItems(self, path):
           self.beginResetModel()
           self.stockdata = self.stockdata
           self.endResetModel()

if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        app.setStyle("plastique")

        tableView = QtGui.QTableView()      
        tableView.show()

        file = open('/home/user/Desktop/file.txt')
        a = file.readline()             # ------> type STRING
        time_variable = QtCore.QString("%s"%a)

        model = StockListModel([time_variable])

        tableView.setModel(model)
        sys.exit(app.exec_())
 

Ответ №1:

Вы не изменяете данные при сбросе модели:

 self.stockdata = self.stockdata
 

Для этой строки необходимо установить self.stockdata обновленное значение. Предположительно, вы хотите прочитать изменения из файла, который вы просматриваете.

Комментарии:

1. Должен ли я каким-то образом повторно заполнять stockdata в конструкторе? например: self.beginResetModel() n «каким-то образом повторно заполнить» n self.endResetModel()

2. Нет, конструктор вызывается только при создании экземпляра объекта. После этого переменная stockdata перестает существовать где бы то ни было. Вы просто сохранили ссылку на его значение в self.stockdata, который является членом StockListModel класса. fileChanged Сигнал отправляет путь к файлу, который изменился, в ваш resetItems слот. Вы можете использовать это для чтения изменений из файла так же, как вы делаете перед созданием модели.

3. Вы имеете в виду что-то в этом роде?: file = open(«%s»%path) n self.stockdata = file.readline()

4. Да, хотя при создании модели вы также преобразуете a в QString ( time_variable ) и передаете в виде списка [time_variable] . Вы должны делать то же самое, что и в первый раз.

5. ‘beginResetModel’, ‘end’ и даже ‘self.stockdata’ не нужны для перезагрузки данных в скрипте. спасибо за поддержку.