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

List:       pykde
Subject:    Re: [PyKDE] Small database application - best way?
From:       "Sibylle Koczian" <Sibylle.Koczian () T-Online ! de>
Date:       2006-11-27 8:50:00
Message-ID: 1GocBv-2F2yIK0 () fwd35 ! sul ! t-online ! de
[Download RAW message or body]

Very sorry: that should have gone to the list!

Koczian

"David Boddie" <david@boddie.org.uk> schrieb:
> On 21 Nov 2006 10:29 GMT, Sibylle Koczian wrote:
> > "David Boddie" <david@boddie.org.uk> schrieb:
> 
> > > Have you put the QTableView in a layout, or did you use QMainWindow for
> > > the window and set the QTableView as the central widget?
> > > 
> > 
> > Put in a layout.
> 
> If the QTableView is in a layout with other controls, you may need to make
> sure that it has a larger stretch factor than they do, to make it as large
> as possible. It may be the case that resizing the main window is the only
> way to give the table more space if the other controls also demand space
> from the layout system.
> 

Begins to look like it; adding a stretch factor didn't help. But this isn't really \
important, I'll get back to it after solving all the other problems. I just thought \
I'd made some quite simple error, easily visible to anybody with more experience.

> An alternative is to try to change the widths of the rows and columns as
> displayed in the table.
> 

That doesn't seem to alter the geometry of the viewport. 

Now back to problems that can't simply be worked around by a little dragging:

I connected the model in sqlcursorview.py with my database. That worked well, as long \
as I didn't try to make the model editable. To this end I implemented flags and \
setData:

def flags(self, index):
    flags = QtCore.QAbstractItemModel.flags(self, index)
    if index.column() in (0, 3, 4):
        flags |= QtCore.Qt.ItemIsEditable
    return flags

def setData(self, index, value, role):
    if role != QtCore.Qt.EditRole:
        return False
    if index.column() == 0:
        self._resultRows[index.row()][0] = value.toString()
    elif index.column() in (3, 4):
        self._resultRows[index.row()][index.column()] = int(value.toString())
    else:
        return False
    self.emit(QtCore.SIGNAL('dataChanged'), index, index)
    return True

Then I put the view and some buttons into a subclass of QWidget and added a small \
function to handle the 'dataChanged' signal:

In the __init__ method of the QWidget subclass:

self.connect(self.model,
             QtCore.SIGNAL('dataChanged(const QModelIndex &, '
                           'const QModelIndex &)'),
             self.ausgeben)
... 

def ausgeben(self, startindex, endindex):
    print 'Daten geändert: Zeile %d, Spalte %d' % (startindex.row(),
                                                   startindex.column())
    print 'Bis Zeile %d, Spalte %d' % (endindex.row(), endindex.column())

The data in column 0 are date values, in column 3 and 4 integer values.

This doesn't work as expected:

The method "ausgeben" is never called.

Double clicking, pressing F2 or Enter in a cell in one of the editable columns \
doesn't select the text of this cell, as it does in the example programs with \
editable models. Instead it erases the text completely. Not helpful, if a small typo \
should be corrected, a date altered by one day or similar small changes are \
necessary.

This last looks like a problem with the used delegate class. But the view is a \
standard QTableView, that should use a QItemDelegate, and the "data" method of the \
model changes everything to a unicode object and then to QVariant. It's the original \
method from the EuroPython example program. So that should work "out of the box", \
shouldn't it?

And a question: how can I convert the QVariant in column 0 to a Python datetime.date \
object, when I put it back into self._resultRows?

Thank you,
Koczian

-- 
Dr. Sibylle Koczian 
Fasanenstrasse 12 
D-82293 Mittelstetten 

_______________________________________________
PyKDE mailing list    PyKDE@mats.imk.fraunhofer.de
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde


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

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