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

Hans-Peter Jansen hpj at urpla.net
Fri Nov 26 14:24:06 GMT 2010


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




More information about the PyQt mailing list