Re: [PyQt] segfault when using a proxy and SIGNAL( clicked(QModelIndex) )

2009-04-23 Thread Darren Dale
On Mon, Apr 13, 2009 at 3:43 PM, Darren Dale dsdal...@gmail.com wrote:



 On Mon, Apr 13, 2009 at 3:11 PM, Andreas Pakulat ap...@gmx.de wrote:

 On 13.04.09 10:27:56, Darren Dale wrote:
  On Mon, Apr 13, 2009 at 9:58 AM, Andreas Pakulat ap...@gmx.de wrote:
   On 13.04.09 14:11:46, Arnold Krille wrote:
It is a pointer for internal purposes, that is internal for the
 model
so it can map indexes to the internal data structures. (And yes,
 that
is needed for anything except simple list or table models.:)
  
   nitpickThats not true actually, you can create the most complex
 model
   imaginable without using the internalPointer, simply by using the
   internalId and the related createIndex overload. That also
 automatically
   solves any problems created by python's refcounting+garbage collection
   (if you forget to store a reference to an object for the model in your
   model)
 
  Could you please sugggest an example of this approach, if you know of
 one?

 Thats easy, provide some way of hashing the objects in your tree, then
 use the hashnumber for the internal id. Often using id(yourobject) works
 quite well as internal id. Then all you need is a dict using the id as
 key and the real object as value, so you can easily look your object up.
 Or maybe your internal data layout already orders the objects in some
 way, then the searching through that tree might be efficiently possible
 and you don't need the dict at all. I don't have a pyqt source tree
 here, but I think the tree model example uses internalId for storing and
 identifier for each object.


 Ok, I think I get it, thank you. When I get time, I'll improve the example
 I posted in the other thread and share it with the list.


I'm sorry, I think I need to ask for a little more clarification. After
failing to convert my own code to use InternalId() instead of
internalPointer, I decided it would be more instructive to convert the
simpletreemodel example distributed with PyQt4 to use internalId. I am
attaching that example, which fails with the repeated errors below. Could
anyone have a look and suggest how it should be improved? It requires other
files that ship with the original PyQt4 simpletreemodel example.

Thanks,
Darren

Traceback (most recent call last):
  File simpletreemodel.py, line 124, in parent
childItem = self.idMap[index.internalId()]
KeyError: 754744568L
Traceback (most recent call last):
  File simpletreemodel.py, line 124, in parent
childItem = self.idMap[index.internalId()]
KeyError: 754744568L
Traceback (most recent call last):
  File simpletreemodel.py, line 124, in parent
childItem = self.idMap[index.internalId()]
KeyError: 754744568L
Traceback (most recent call last):
  File simpletreemodel.py, line 139, in rowCount
parentItem = self.idMap[parent.internalId()]
KeyError: 754744568L
Traceback (most recent call last):
  File simpletreemodel.py, line 89, in data
item = self.idMap[index.internalId()]
KeyError: 754744568L
Traceback (most recent call last):
  File simpletreemodel.py, line 89, in data
item = self.idMap[index.internalId()]
KeyError: 754744568L
#!/usr/bin/env python

***
**
** Copyright (C) 2005-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 sa...@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.
**
***

import sys
from PyQt4 import QtCore, QtGui

import simpletreemodel_rc


class TreeItem:
def __init__(self, data, parent=None):
self.parentItem = parent
self.itemData = data
self.childItems = []

def appendChild(self, item):
self.childItems.append(item)

def child(self, row):
return self.childItems[row]

def childCount(self):
return len(self.childItems)

def columnCount(self):
return len(self.itemData)

def data(self, column):
return self.itemData[column]

def parent(self):
return self.parentItem

def row(self):
if self.parentItem:
return self.parentItem.childItems.index(self)

return 0


class TreeModel(QtCore.QAbstractItemModel):
def __init__(self, 

Re: [PyQt] segfault when using a proxy and SIGNAL( clicked(QModelIndex) )

2009-04-23 Thread Darren Dale
On Thu, Apr 23, 2009 at 12:28 PM, Darren Dale dsdal...@gmail.com wrote:



 On Mon, Apr 13, 2009 at 3:43 PM, Darren Dale dsdal...@gmail.com wrote:



 On Mon, Apr 13, 2009 at 3:11 PM, Andreas Pakulat ap...@gmx.de wrote:

 On 13.04.09 10:27:56, Darren Dale wrote:
  On Mon, Apr 13, 2009 at 9:58 AM, Andreas Pakulat ap...@gmx.de wrote:
   On 13.04.09 14:11:46, Arnold Krille wrote:
It is a pointer for internal purposes, that is internal for the
 model
so it can map indexes to the internal data structures. (And yes,
 that
is needed for anything except simple list or table models.:)
  
   nitpickThats not true actually, you can create the most complex
 model
   imaginable without using the internalPointer, simply by using the
   internalId and the related createIndex overload. That also
 automatically
   solves any problems created by python's refcounting+garbage
 collection
   (if you forget to store a reference to an object for the model in
 your
   model)
 
  Could you please sugggest an example of this approach, if you know of
 one?

 Thats easy, provide some way of hashing the objects in your tree, then
 use the hashnumber for the internal id. Often using id(yourobject) works
 quite well as internal id. Then all you need is a dict using the id as
 key and the real object as value, so you can easily look your object up.
 Or maybe your internal data layout already orders the objects in some
 way, then the searching through that tree might be efficiently possible
 and you don't need the dict at all. I don't have a pyqt source tree
 here, but I think the tree model example uses internalId for storing and
 identifier for each object.


 Ok, I think I get it, thank you. When I get time, I'll improve the example
 I posted in the other thread and share it with the list.


 I'm sorry, I think I need to ask for a little more clarification. After
 failing to convert my own code to use InternalId() instead of
 internalPointer, I decided it would be more instructive to convert the
 simpletreemodel example distributed with PyQt4 to use internalId. I am
 attaching that example, which fails with the repeated errors below. Could
 anyone have a look and suggest how it should be improved? It requires other
 files that ship with the original PyQt4 simpletreemodel example.

 Thanks,
 Darren

 Traceback (most recent call last):
   File simpletreemodel.py, line 124, in parent
 childItem = self.idMap[index.internalId()]
 KeyError: 754744568L
 Traceback (most recent call last):
   File simpletreemodel.py, line 124, in parent
 childItem = self.idMap[index.internalId()]
 KeyError: 754744568L
 Traceback (most recent call last):
   File simpletreemodel.py, line 124, in parent
 childItem = self.idMap[index.internalId()]
 KeyError: 754744568L
 Traceback (most recent call last):
   File simpletreemodel.py, line 139, in rowCount
 parentItem = self.idMap[parent.internalId()]
 KeyError: 754744568L
 Traceback (most recent call last):
   File simpletreemodel.py, line 89, in data
 item = self.idMap[index.internalId()]
 KeyError: 754744568L
 Traceback (most recent call last):
   File simpletreemodel.py, line 89, in data
 item = self.idMap[index.internalId()]
 KeyError: 754744568L


I was confused about how QModelIndex works, I thought passing a hash to
createIndex meant that the hash was the index's internalId, but that is not
the case. So I was using the hash as my idMap key, when I should have been
using internalId. Here is a working script.
#!/usr/bin/env python

***
**
** Copyright (C) 2005-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 sa...@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.
**
***

import sys
from PyQt4 import QtCore, QtGui

import simpletreemodel_rc


class TreeItem:
def __init__(self, data, parent=None):
self.parentItem = parent
self.itemData = data
self.childItems = []

def appendChild(self, item):
self.childItems.append(item)

def child(self, row):
return self.childItems[row]

def childCount(self):
return len(self.childItems)

Re: [PyQt] segfault when using a proxy and SIGNAL( clicked(QModelIndex) )

2009-04-13 Thread Arnold Krille
Hi,

On Thursday 09 April 2009 19:35:32 TP wrote:
 Here are the most important lines:
 self.view = QTreeView( parent )
 self.connect( self.view, SIGNAL( clicked(QModelIndex) )
 , self.cellClicked )
 def cellClicked( self, qmodelindex ):
 if qmodelindex.isValid():
 print qmodelindex.internalPointer()
 The problem seems to be related to qmodelindex, the segfault appears when
 taking internalPointer method.

I think there is a very good reason internalPointer has the name it has. It is 
a pointer for internal purposes, that is internal for the model so it can map 
indexes to the internal data structures. (And yes, that is needed for anything 
except simple list or table models.:)

You shouldn't really access it from a view (or from a proxy-model). Actually 
the reason for the model-view-pattern is that you don't have to access the 
internal structures of the model from the view...

And here is another reason this crashes: Not only don't you know which type 
(if any) the object pointed to is, you also don't know whether python knows 
about that data type (python doesn't really know about pointers).

Have fun,

Arnold


signature.asc
Description: This is a digitally signed message part.
___
PyQt mailing listPyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Re: [PyQt] segfault when using a proxy and SIGNAL( clicked(QModelIndex) )

2009-04-13 Thread Andreas Pakulat
On 13.04.09 14:11:46, Arnold Krille wrote:
 It is a pointer for internal purposes, that is internal for the model
 so it can map indexes to the internal data structures. (And yes, that
 is needed for anything except simple list or table models.:)

nitpickThats not true actually, you can create the most complex model
imaginable without using the internalPointer, simply by using the
internalId and the related createIndex overload. That also automatically
solves any problems created by python's refcounting+garbage collection
(if you forget to store a reference to an object for the model in your
model)

Andreas

-- 
Your aim is high and to the right.
___
PyQt mailing listPyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt


Re: [PyQt] segfault when using a proxy and SIGNAL( clicked(QModelIndex) )

2009-04-13 Thread Darren Dale
Hi Andreas,

On Mon, Apr 13, 2009 at 9:58 AM, Andreas Pakulat ap...@gmx.de wrote:

 On 13.04.09 14:11:46, Arnold Krille wrote:
  It is a pointer for internal purposes, that is internal for the model
  so it can map indexes to the internal data structures. (And yes, that
  is needed for anything except simple list or table models.:)

 nitpickThats not true actually, you can create the most complex model
 imaginable without using the internalPointer, simply by using the
 internalId and the related createIndex overload. That also automatically
 solves any problems created by python's refcounting+garbage collection
 (if you forget to store a reference to an object for the model in your
 model)


Could you please sugggest an example of this approach, if you know of one? I
started a thread on March 10 on this mailing list (seeking advice on why
this script segfaults) where I put together an unsatisfying work around to
avoid segfaults that were probably caused by my use of internalPointer.

Thanks,
Darren
___
PyQt mailing listPyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Re: [PyQt] segfault when using a proxy and SIGNAL( clicked(QModelIndex) )

2009-04-13 Thread Andreas Pakulat
On 13.04.09 10:27:56, Darren Dale wrote:
 On Mon, Apr 13, 2009 at 9:58 AM, Andreas Pakulat ap...@gmx.de wrote:
  On 13.04.09 14:11:46, Arnold Krille wrote:
   It is a pointer for internal purposes, that is internal for the model
   so it can map indexes to the internal data structures. (And yes, that
   is needed for anything except simple list or table models.:)
 
  nitpickThats not true actually, you can create the most complex model
  imaginable without using the internalPointer, simply by using the
  internalId and the related createIndex overload. That also automatically
  solves any problems created by python's refcounting+garbage collection
  (if you forget to store a reference to an object for the model in your
  model)
 
 Could you please sugggest an example of this approach, if you know of one?

Thats easy, provide some way of hashing the objects in your tree, then
use the hashnumber for the internal id. Often using id(yourobject) works
quite well as internal id. Then all you need is a dict using the id as
key and the real object as value, so you can easily look your object up.
Or maybe your internal data layout already orders the objects in some
way, then the searching through that tree might be efficiently possible
and you don't need the dict at all. I don't have a pyqt source tree
here, but I think the tree model example uses internalId for storing and
identifier for each object.

Andreas

-- 
Lady Luck brings added income today.  Lady friend takes it away tonight.
___
PyQt mailing listPyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt


Re: [PyQt] segfault when using a proxy and SIGNAL( clicked(QModelIndex) )

2009-04-13 Thread Darren Dale
On Mon, Apr 13, 2009 at 3:11 PM, Andreas Pakulat ap...@gmx.de wrote:

 On 13.04.09 10:27:56, Darren Dale wrote:
  On Mon, Apr 13, 2009 at 9:58 AM, Andreas Pakulat ap...@gmx.de wrote:
   On 13.04.09 14:11:46, Arnold Krille wrote:
It is a pointer for internal purposes, that is internal for the model
so it can map indexes to the internal data structures. (And yes, that
is needed for anything except simple list or table models.:)
  
   nitpickThats not true actually, you can create the most complex model
   imaginable without using the internalPointer, simply by using the
   internalId and the related createIndex overload. That also
 automatically
   solves any problems created by python's refcounting+garbage collection
   (if you forget to store a reference to an object for the model in your
   model)
 
  Could you please sugggest an example of this approach, if you know of
 one?

 Thats easy, provide some way of hashing the objects in your tree, then
 use the hashnumber for the internal id. Often using id(yourobject) works
 quite well as internal id. Then all you need is a dict using the id as
 key and the real object as value, so you can easily look your object up.
 Or maybe your internal data layout already orders the objects in some
 way, then the searching through that tree might be efficiently possible
 and you don't need the dict at all. I don't have a pyqt source tree
 here, but I think the tree model example uses internalId for storing and
 identifier for each object.


Ok, I think I get it, thank you. When I get time, I'll improve the example I
posted in the other thread and share it with the list.

Darren
___
PyQt mailing listPyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Re: [PyQt] segfault when using a proxy and SIGNAL( clicked(QModelIndex) )

2009-04-11 Thread Demetrius Cassidy

Why do you need access to the QModelIndex internal pointer? It sounds like
you are trying to access a null pointer, causing a crash.

Looking at the signature, ptr is some sort of id or extra data associated
with the index, which you probably need to add yourself when creating an
index.

QModelIndex QAbstractItemModel::createIndex ( int row, int column, void *
ptr = 0 ) const   [protected]


TP-5 wrote:
 
 TP a écrit :
 Could this be a bug in PyQt?
 
 Has someone tried my script to check if the segfault is reproducible?
 
 Julien
 
 ___
 PyQt mailing listPyQt@riverbankcomputing.com
 http://www.riverbankcomputing.com/mailman/listinfo/pyqt
 
 

-- 
View this message in context: 
http://www.nabble.com/segfault-when-using-a-proxy-and-SIGNAL%28-%22clicked%28QModelIndex%29%22-%29-tp22977318p23006807.html
Sent from the PyQt mailing list archive at Nabble.com.


___
PyQt mailing listPyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt