[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    Re: [PyQt] QSqlQueryModel write subclass
From:       Linos <info () linos ! es>
Date:       2007-10-21 22:10:37
Message-ID: 471BCE5D.8050405 () linos ! es
[Download RAW message or body]

well my model its working now (i have tested with tableview and datawidgetmapper) but \
i have a question to the list about the way i have designed it, now i load with a \
select the model (original sqlquerymodel) and when from the view add new rows i use \
an internal buffer (a list of python objects with the same struct as table), i have \
implemented data, setdata, insertrows and removerows this way and it works ok for me, \
when i update a sql returned row i use sql directly and relaunch the query to update \
the view and when i edit a field in the object list edit the list i launch an \
datachanged signal to update the view and i have created a save() function to save \
all the buffer to database and clear the buffer, but i have any questions to the \
list, in qtcentre.org forum a user (that has 7081 posts wow) has post this:

'''
In my opinion you shouldn't subclass the sql query model. It might prove easier to \
implement a model from scratch using QAbstractTableModel or even QStandardItemModel \
and using QSqlQuery and/or QSqlTableModel behind the scenes. Otherwise you'll have \
problems with updating the model - after each change to the sql table, you'll have to \
use select() to fetch the updated model from the database (or it won't update), \
rendering the whole model-view gain practically useless, because you'll be losing \
selections, current items, etc. '''

so after think a bit about it i think i can be misusing the model, i could use \
sqlquery inside the model to load a list of python objects and use it in the model, i \
am using this now in the editbuffer, emitting datachanged works ok with this, i could \
do the changes to database in background in the model, but i dont know if the speed \
would be good with large datasets, any comments about this would be appreciated, \
thanks.

Linos escribió:
> David thanks for your reply i get this to work yesterday, the problem was that i \
> was not implementing rowcount() so the new line was painted in the view but it did \
> not have real index so data() and setdata() could not use it, i am today working in \
> a Qsqlquerymodel subclass with a buffer of rows to insert it all in a final \
> transaction if the model have dirty property true. 
> Best Regards,
> Miguel Angel.
> 
> David Boddie escribió:
> > On Wednesday 17 October 2007 12:14:52 +0200, Linos wrote:
> > 
> > > I am goin crazy with this problem, i have tested with qsqltablemodel
> > > subclassing and it works ok if a dont write the insertRows method in the
> > > subclass:
> > > 
> > > (model)
> > > class SkudaSqlTableModel(QSqlTableModel):
> > > def __init__(self, dbcursor=None):
> > > super(SkudaSqlTableModel, self).__init__()
> > > 
> > > 
> > > (QDialog)
> > > def addRecord(self):
> > > row = self.querymodel.rowCount()
> > > self.querymodel.insertRow(row)
> > > 
> > > 
> > > this works ok and gives me an new row with an '*' in the vertical header
> > > and i can edit the line but if i do this:
> > > 
> > > (model)
> > > class SkudaSqlTableModel(QSqlTableModel):
> > > def __init__(self, dbcursor=None):
> > > super(SkudaSqlTableModel, self).__init__()
> > > 
> > > def insertRows(self, position, rows=1 , index=QModelIndex()):
> > > self.beginInsertRows(QModelIndex(), position, position + rows - 1)
> > > self.endInsertRows()
> > > return True
> > Normally, when you reimplement insertRows() you would do something between
> > calling beginInsertRows() and endInsertRows(). Not being familiar with the
> > internals of QSqlTableModel, I'm not sure what should be done.
> > 
> > > (QDialog)
> > > def addRecord(self):
> > > row = self.querymodel.rowCount()
> > > self.querymodel.insertRow(row)
> > > 
> > > i get a new line with the next number in the vertical header (not *) and i
> > > cant edit the line. So i suppose i have any problem in my insertRows method
> > > but i have read the QSqlTableModel source code insertRows method, i paste
> > > here the strategy OnRowchange because is what i am using.
> > OK, so do you basically want to fine-tune the behaviour of the table model
> > or are you trying to achieve something else by subclassing QSqlTableModel?
> > 
> > [...]
> > 
> > > I cant find any other action to implement in my method apart from
> > > beginInsertRows and endInsertRows, i am not using the insertIndex number (i
> > > use rowCount()), not clearEditBuffer() because i have no buffer to clear in
> > > this test and primeInsert is a signal no connected to anything so i dont
> > > emit it, anyway i have tried using exactly the same (all of them) in my
> > > method with exactly the same problem, can anyone please open my closed mind
> > > with this annoying problem?
> > I suppose that the lines
> > 
> > d->insertIndex = row;
> > d->clearEditBuffer();
> > 
> > may have some side effects, but it's difficult to see what those could be
> > without more detailed study. Plus, there's nothing you can do to access
> > the internals in such a way.
> > 
> > > i will use qsqltablemodel subclass with 
> > > setQuery (inherited from QSqlQuery) to do joins and other stuff if i cant
> > > fix this (but this is not recommended in documentation).
> > I imagine that using setQuery() might interfere with the normal operation
> > of the model if you're not careful.
> > 
> > David
> > 
> > 
> > _______________________________________________
> > PyQt mailing list    PyQt@riverbankcomputing.com
> > http://www.riverbankcomputing.com/mailman/listinfo/pyqt
> 
> 
> _______________________________________________
> PyQt mailing list    PyQt@riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt

_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic