[PyQt] How to update an QAbstactTableModel

Felix Schmidt fschmidt at bihl-wiedemann.de
Wed Dec 9 08:43:50 GMT 2009


despen at verizon.net schrieb:
> Simon Hibbs <simon.hibbs at gmail.com> writes:
>
>   
>>> I've written a stock portfolio tracker in pyqt4. The main window which
>>> is a QAbstractTableModel has an Update button. When I click it, the
>>> program gets new stock prices and updates the data in the table.
>>>
>>> My problem is that the data displayed in the table doesn't update until
>>> the window loses and regains focus....
>>>       
>> If you're loading the data into the database directly using SQL, then QT
>> won't be aware of the change. You could tryusing
>> QSqlRelationalTableModel.setData() to push the data into the model. It's
>> described here:
>>     
>
> Thanks for the reply.
>
> I'm not using SQL.
> I get updated prices for stocks from Yahoo.  That changes the stuff
> being displayed.
>
> The init method is like this:
>
> class MyTableModel(QAbstractTableModel): 
>     def __init__(self, datain, headerdata, parent=None, *args): 
>         QAbstractTableModel.__init__(self, parent, *args) 
>         self.arraydata = datain
>         self.headerdata = headerdata
>
> and the init method gets called like this;
>
>         tm = MyTableModel(self.tabledata, header, self) 
>
> My problem is getting new data from tabledata into the display.
> The init above works but later on from a shortcut I
> tabledata and do:
>
>         tm.changeData(self.tabledata)
>
> and changeData does:
>
>     def changeData(self, datain):
>         self.emit(SIGNAL("LayoutAboutToBeChanged()"))
>         self.arraydata = datain
>         self.emit(SIGNAL("LayoutChanged()"))
>
> I also tried changing the word "Layout" to "Data" but neither
> causes the table to update after the shortcut.
>
> If I unfocus and focus the window it does update.
> So I think I'm getting the data into the table, it's just not
> repainting itself.
>
> The data method for the table looks like this:
>
>     def data(self, index, role): 
>         if not index.isValid(): 
>             return QVariant() 
>         elif role == Qt.TextAlignmentRole: 
>             if (index.column() == 0):
>                 return Qt.AlignLeft
>             return Qt.AlignRight
>         elif role == Qt.BackgroundColorRole:
>             symbol = self.arraydata[index.row()][0]
>             if symbol == "$" :
>                 return QVariant(QColor(0xEE, 0xFF, 0xEE))
>             shares = self.arraydata[index.row()][1]
>             if shares == '0' :
>                 return QVariant(QColor('wheat'))
>             if symbol[0] == '^' :
>                 return QVariant(QColor(0xEE, 0xEE, 0xF5))
>             if index.row() == len(self.arraydata) - 1 :
>                 return QVariant(QColor('lightgray'))
>             return QVariant()
>         elif role == Qt.TextColorRole:
>             content = self.arraydata[index.row()][index.column()]
>             if content != 0 and str(content)[0] == '-' :
>                 return QVariant(QColor('red'))
>             return QVariant() 
>         elif role != Qt.DisplayRole: 
>             return QVariant() 
>         return QVariant(self.arraydata[index.row()][index.column()]) 
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
>
>   
Try
self.dataChanged.emit(self.createIndex(0, 0), 
self.createIndex(self.rowCount(0), self.columnCount(0)))
respectively
self.emit(SIGNAL("DataChanged(QModelIndex,QModelIndex)"), 
self.createIndex(0, 0), self.createIndex(self.rowCount(0)), 
self.columnCount(0))
in your changeData Method to update all data in your QTableView.
If you change number of rows and/or columns, keep the LayoutChanged() 
SIGNALs.

Felix Schmidt
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20091209/317c65f1/attachment.html


More information about the PyQt mailing list