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

sbremal at hotmail.com sbremal at hotmail.com
Fri Nov 26 09:24:32 GMT 2010


I try again as attachment.

----------------------------------------
> From: sbremal at hotmail.com
> To: hpj at urpla.net; pyqt at riverbankcomputing.com
> Subject: RE: [PyQt] OnManualSubmit + insertRows: EditRole and DisplayRole = QVariant.Invalid?
> Date: Fri, 26 Nov 2010 09:22:02 +0000
>
>
> 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.
>
> 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 		 	   		  
-------------- next part --------------
A non-text attachment was scrubbed...
Name: connection.py
Type: text/x-script.phyton
Size: 6525 bytes
Desc: not available
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20101126/cbda0346/attachment-0001.bin>


More information about the PyQt mailing list