#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’ не нужны для перезагрузки данных в скрипте. спасибо за поддержку.