[PyQt] OnManualSubmit + insertRows: EditRole and DisplayRole = QVariant.Invalid?

sbremal at hotmail.com sbremal at hotmail.com
Fri Nov 26 15:14:11 GMT 2010


Python 2.7
PyQT 4.7.6
Microsoft Windows XP [Version 5.1.2600]
 
SIP version? It must be the one that comes with "PyQt-Py2.7-gpl-4.7.6-1.exe"
 
One more remark, the example I posted earlier uses QSQLITE and the editor is broken for all cells (both existing and just inserted), while with QPSQL only new cells are affected. How strange...
 
 
Cheers,
Balazs

----------------------------------------
> From: hpj at urpla.net
> To: pyqt at riverbankcomputing.com
> Date: Fri, 26 Nov 2010 15:24:06 +0100
> Subject: Re: [PyQt] OnManualSubmit + insertRows: EditRole and DisplayRole = QVariant.Invalid?
>
> On Friday 26 November 2010, 10:22:02 sbremal at hotmail.com wrote:
> > Thanks for the quick reply. Here is a small rewrite (extension) of
> > "connection.py". If you comment out the line
> > "m.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)" then it is
> > all fine, otherwise the custom editor widget for "int" is not picked
> > by the Q table.
>
> Although the issue is not related to your custom editor, since it
> happens with the default item editors as well, it pretty much looks
> like it's related to the QVariant issue I noticed yesterday.
>
> Please tell us your Qt/python/sip/PyQt and OS versions.
>
> Pete
>
> > Any idea?
> >
> >
> > Cheers,
> > B.
> >
> > ---
> >
> > connection.py
> >
> > #!/bin/env python
> > import os
> > import sys
> > #####################################################################
> >####### ##
> > ## Copyright (C) 2004-2005 Trolltech AS. All rights reserved.
> > ##
> > ## This file is part of the example classes of the Qt Toolkit.
> > ##
> > ## This file may be used under the terms of the GNU General Public
> > ## License version 2.0 as published by the Free Software Foundation
> > ## and appearing in the file LICENSE.GPL included in the packaging of
> > ## this file. Please review the following information to ensure GNU
> > ## General Public Licensing requirements will be met:
> > ## http://www.trolltech.com/products/qt/opensource.html
> > ##
> > ## If you are unsure which license is appropriate for your use,
> > please ## review the following information:
> > ## http://www.trolltech.com/products/qt/licensing.html or contact the
> > ## sales department at sales at trolltech.com.
> > ##
> > ## This file is provided AS IS with NO WARRANTY OF ANY KIND,
> > INCLUDING THE ## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR
> > A PARTICULAR PURPOSE. ##
> > #####################################################################
> >####### from PyQt4 import QtSql, QtGui, QtCore
> >
> > def createConnection():
> > db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
> > db.setDatabaseName(":memory:")
> > if not db.open():
> > QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open
> > database"), QtGui.qApp.tr("Unable to establish a database
> > connection.\n" "This example needs SQLite support. Please read " "the
> > Qt SQL driver documentation for information " "how to build it.\n\n"
> > "Click Cancel to exit."),
> > QtGui.QMessageBox.Cancel)
> > return False
> >
> > query = QtSql.QSqlQuery()
> > query.exec_("create table person(id int primary key, "
> > "firstname varchar(20), lastname varchar(20))")
> > query.exec_("insert into person values(101, 'Danny', 'Young')")
> > query.exec_("insert into person values(102, 'Christine',
> > 'Holand')") query.exec_("insert into person values(103, 'Lars',
> > 'Gordon')") query.exec_("insert into person values(104, 'Roberto',
> > 'Robitaille')") query.exec_("insert into person values(105, 'Maria',
> > 'Papadopoulos')") query.exec_("create table offices (id int primary
> > key,"
> > "imagefile int,"
> > "location varchar(20),"
> > "country varchar(20),"
> > "description
> > varchar(100))"); query.exec_("insert into offices "
> > "values(0, 0, 'Oslo', 'Norway',"
> > "'Oslo is home to more than 500 000 citizens and has a
> > " "lot to offer.It has been called \"The city with the big " "heart\"
> > and this is a nickname we are happy to live up to.')")
> > query.exec_("insert into offices "
> > "values(1, 1, 'Brisbane', 'Australia',"
> > "'Brisbane is the capital of Queensland, the Sunshine
> > State, " "where it is beautiful one day, perfect the next. "
> > "Brisbane is Australia''s 3rd largest city, being home " "to almost 2
> > million people.')")
> > query.exec_("insert into offices "
> > "values(2, 2, 'Redwood City', 'US',"
> > "'You find Redwood City in the heart of the Bay Area "
> > "just north of Silicon Valley. The largest nearby city
> > is " "San Jose which is the third largest city in California " "and
> > the 10th largest in the US.')")
> > query.exec_("insert into offices "
> > "values(3, 3, 'Berlin', 'Germany',"
> > "'Berlin, the capital of Germany is dynamic,
> > cosmopolitan " "and creative, allowing for every kind of lifestyle. "
> > "East meets West in the metropolis at the heart of a " "changing
> > Europe.')")
> > query.exec_("insert into offices "
> > "values(4, 4, 'Munich', 'Germany',"
> > "'Several technology companies are represented in
> > Munich, " "and the city is often called the \"Bavarian Silicon
> > Valley\". " "The exciting city is also filled with culture, " "art
> > and music. ')")
> > query.exec_("insert into offices "
> > "values(5, 5, 'Beijing', 'China',"
> > "'Beijing as a capital city has more than 3000 years
> > of " "history. Today the city counts 12 million citizens, and " "is
> > the political, economic and cultural centre of China.')")
> > query.exec_("create table images (locationid int, file varchar(20))")
> > query.exec_("insert into images values(0, 'images/oslo.png')")
> > query.exec_("insert into images values(1, 'images/brisbane.png')")
> > query.exec_("insert into images values(2, 'images/redwood.png')")
> > query.exec_("insert into images values(3, 'images/berlin.png')")
> > query.exec_("insert into images values(4, 'images/munich.png')")
> > query.exec_("insert into images values(5, 'images/beijing.png')")
> > return True
> > class Line_editor_creator(QtGui.QItemEditorCreatorBase):
> > def createWidget(self, parent):
> > return QtGui.QLineEdit(parent)
> > class X(QtGui.QMainWindow):
> > def __init__(self, parent = None):
> > QtGui.QMainWindow.__init__(self, parent)
> > line_editor_creator = Line_editor_creator()
> > item_editor_factory = QtGui.QItemEditorFactory()
> > item_editor_factory.registerEditor(QtCore.QVariant.Int,
> > line_editor_creator)
> > QtGui.QItemEditorFactory.setDefaultFactory(item_editor_factory) m =
> > QtSql.QSqlTableModel()
> > #
> > # With "OnManualSubmit" the below "prints" show:
> > # qlonglong
> > # qlonglong
> > # None
> > # None
> > #
> > # With default "OnRowChange":
> > # qlonglong
> > # qlonglong
> > # int
> > # int
> > #
> > m.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
> > m.setTable('offices')
> > v = QtGui.QTableView()
> > v.setModel(m)
> > r = QtSql.QSqlRelationalDelegate(v)
> > v.setItemDelegate(r)
> > m.select()
> > self.setCentralWidget(v)
> > i = m.rowCount()
> > m.insertRow(i)
> > print(m.data(m.index(i - 1, 0), QtCore.Qt.DisplayRole).typeName())
> > print(m.data(m.index(i - 1, 0), QtCore.Qt.EditRole).typeName())
> > print(m.data(m.index(i, 0), QtCore.Qt.DisplayRole).typeName())
> > print(m.data(m.index(i, 0), QtCore.Qt.EditRole).typeName())
> > if __name__ == "__main__":
> > a = QtGui.QApplication(sys.argv)
> > createConnection()
> > x = X()
> > x.showMaximized()
> > sys.exit(a.exec_())
> >
> > ----------------------------------------
> >
> > > From: hpj at urpla.net
> > > To: pyqt at riverbankcomputing.com
> > > Date: Thu, 25 Nov 2010 21:08:36 +0100
> > > Subject: Re: [PyQt] OnManualSubmit + insertRows: EditRole and
> > > DisplayRole = QVariant.Invalid?
> > >
> > > On Thursday 25 November 2010, 17:57:09 sbremal at hotmail.com wrote:
> > > > Hello,
> > > >
> > > > With OnManualSubmit on QSqlTableModel using the insertRows
> > > > function the cell roles for EditRole and DisplayRole is not set
> > > > properly. Actually they seem to remain uninitialized and have the
> > > > value QVariant.Invalid. This causes my table editors to behave
> > > > stange (but only for new rows).
> > > >
> > > > With OnRowChange it is all fine.
> > >
> > > The usual "please provide a minimum runnable example" applies here
> > > too..
> > >
> > > You may base it on examples/connection.py for database setup.
> > >
> > > Pete
> > > _______________________________________________
> > > PyQt mailing list PyQt at riverbankcomputing.com
> > > http://www.riverbankcomputing.com/mailman/listinfo/pyqt
> >
> > _______________________________________________
> > PyQt mailing list PyQt at riverbankcomputing.com
> > http://www.riverbankcomputing.com/mailman/listinfo/pyqt
>
>
> _______________________________________________
> PyQt mailing list PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt 		 	   		  


More information about the PyQt mailing list