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

List:       pykde
Subject:    [PyQt] Segfault with PyQt
From:       "Alexandre Badez" <alexandre.badez () gmail ! com>
Date:       2008-01-17 16:44:47
Message-ID: 20f595e90801170844m44e04a86ya89d2a4b62d65a05 () mail ! gmail ! com
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]


Hye every body,

I've got a problem with PyQt (4.1.1 (262401)) /Qt (v4.1.4 (262404)).
I'm coding for windows (W2K), and Unix (Solaris 5.8)

As you see in Error_Simple.py, the application crash if the view is a tree
but not a table nor a list view.

My question is, what am I doing wrong in my model, that make it appen ?
Is it a bug ?

Error.py, is a bit more complex script that test (kind of) every
possibilities of this bug.

-- 
Alex

[Attachment #5 (text/html)]

Hye every body,<br><br>I&#39;ve got a problem with PyQt (4.1.1 (262401)) /Qt (v4.1.4 \
(262404)).<br>I&#39;m coding for windows (W2K), and Unix (Solaris 5.8)<br><br>As you \
see in Error_Simple.py, the application crash if the view is a tree but not a table \
nor a list view. <br><br>My question is, what am I doing wrong in my model, that make \
it appen ?<br>Is it a bug ?<br><br>Error.py, is a bit more complex script that test \
(kind of) every possibilities of this bug.<br clear="all"><br>-- <br> Alex<br>


["Error.py" (text/plain)]

#! /bin/env python
from PyQt4 import QtGui
from PyQt4 import QtCore
import sys
import os
import time

lProb = []

class myModel(QtCore.QAbstractItemModel):
    def __init__(self, parent=None):
        self._myDataStruct = None
        super(myModel, self).__init__(parent)

    def setDataStruct(self, myDataStruct):
        self._myDataStruct = myDataStruct

    def columnCount(self, parent=None):
        return 1

    def data(self, index, role):
        if index.isValid() and role == QtCore.Qt.DisplayRole:
            data = QtCore.QVariant(str(self.getMyObjectFromIndex(index)))
        else:
            data = QtCore.QVariant()        
        return data

    def flags(self, index):
        if not index.isValid():
            flags = QtCore.Qt.ItemIsEnabled
        else:
            flags = QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
        return flags

    def headerData(self, section, orientation, role):
        if role == QtCore.Qt.DisplayRole:
            v = QtCore.QVariant("header")
        else:
            v = QtCore.QVariant()
        return v

    def index(self, row, column, parent):
        if (parent is None) or (not parent.isValid()):
            parentNode = self._myDataStruct
        else:
            parentNode = self._myDataStruct.getMyObjectFromIndex(parent)
            if parentNode is None:
                parentNode = self._myDataStruct

        try:
            childNode = parentNode[row]
        except IndexError:
            childNode = None
        
        if childNode is not None:
            return self.createIndex(row, column, id(childNode))
        else:
            return QtCore.QModelIndex()

    def parent(self, index):
        parentIndex = None
        if not index.isValid():
            parentIndex = QtCore.QModelIndex()
        else:
            childNode = self.getMyObjectFromIndex(index)
            if childNode is None:
                parentIndex = QtCore.QModelIndex()
            else:
                parentIndex = self.getIndexFromMyObject(self._myDataStruct)
        return parentIndex

    def rowCount(self, parent):
        if not parent.isValid():
            node = self._myDataStruct
        else:
            node = self.getMyObjectFromIndex(parent)
        return len(node)

    def getIndexFromMyObject(self, myObject):
        try:
            dataIndex = self._myDataStruct.getIndex(myObject)
        except ValueError:
            index = QtCore.QModelIndex()
        else:
            index = self.createIndex(dataIndex, 0, id(myObject))
        return index

    def getMyObjectFromIndex(self, index):
        return self._myDataStruct.getData(index.internalId())

    def crashMethod11(self):
        QtGui.QDialog().exec_()
        self.beginRemoveRows(QtCore.QModelIndex(), 0, 0)
        self.endRemoveRows()
        return True

    def crashMethod12(self):
        self.beginRemoveRows(QtCore.QModelIndex(), 0, 0)
        QtGui.QDialog().exec_()
        self.endRemoveRows()
        return True

    def crashMethod13(self):
        self.beginRemoveRows(QtCore.QModelIndex(), 0, 0)
        self.endRemoveRows()
        QtGui.QDialog().exec_()
        return True

    def crashMethod21(self):
        QtGui.QDialog().exec_()
        self.beginRemoveRows(QtCore.QModelIndex(), 0, 0)
        QtGui.QDialog().exec_()
        self.endRemoveRows()
        return True

    def crashMethod22(self):
        QtGui.QDialog().exec_()
        self.beginRemoveRows(QtCore.QModelIndex(), 0, 0)
        self.endRemoveRows()
        QtGui.QDialog().exec_()
        return True

    def crashMethod23(self):
        self.beginRemoveRows(QtCore.QModelIndex(), 0, 0)
        QtGui.QDialog().exec_()
        self.endRemoveRows()
        QtGui.QDialog().exec_()
        return True

    def crashMethod3(self):
        QtGui.QDialog().exec_()
        self.beginRemoveRows(QtCore.QModelIndex(), 0, 0)
        QtGui.QDialog().exec_()
        self.endRemoveRows()
        QtGui.QDialog().exec_()
        return True

class myDataStruct(object):
    def __init__(self):
        self._data = []
        self._dico = {}

    def __str__(self):
        return str(self._dico)
    
    def __iter__(self):
        return self._data.__iter__()

    def __getitem__(self, index):
        return self._data[index]
    
    def __len__(self):
        return len(self._data)

    def addData(self, myObjectToStore):
        self._data.append(myObjectToStore)
        self._dico[id(myObjectToStore)] = myObjectToStore
        
    def getData(self, id_):
        return self._dico[id_]
    
    def getIndex(self, myObject):
        return self._data.index(myObject)

class myObjectStored(object):
    def __init__(self):
        self._data = None

    def __len__(self):
        return 0

    def setData(self, data):
        self._data = data
    
    def __str__(self):
        return self._data

class myTest(object):
    def __init__(self):
        self._data = myDataStruct()
        self._model = None
        self._proxy = None

    def _initModelAndProxy(self):
        self._model = myModel()
        self._model.setDataStruct(self._data)
        
        self._proxy = QtGui.QSortFilterProxyModel()
        self._proxy.setSourceModel(self._model)

    def _closeModelAndProxy(self):
        del self._model
        del self._proxy

    def addObjectToData(self):
        obj = myObjectStored()
        obj.setData("obj "+ str(id(obj)))
        self._data.addData(obj)

    def testAllView(self):
        self._testViewWithMethod("crashMethod11")
        self._testViewWithMethod("crashMethod12")
        self._testViewWithMethod("crashMethod13")
        self._testViewWithMethod("crashMethod21")
        self._testViewWithMethod("crashMethod22")
        self._testViewWithMethod("crashMethod23")
        self._testViewWithMethod("crashMethod3")

    def _testViewWithMethod(self, crashMethodName):
        print "**********************************\n\t\tTest All View with:"
        for d in self._data:
            print "\t%(name)s\t%(id)d" % {
                'name' : str(d),
                'id' : id(d)}
        print "\t\tand method: ", crashMethodName
        self._testView(self._getListView, crashMethodName)
        self._testView(self._getTableView, crashMethodName)
        self._testView(self._getTreeView, crashMethodName)

    def _getListView(self):
        return QtGui.QListView, "View"

    def _getTableView(self):
        return QtGui.QTableView, "Table"

    def _getTreeView(self):
        return QtGui.QTreeView, "Tree"

    def _testView(self, factory, crashMethodName):
        clsView, name = factory()
        
        print name
        self._initModelAndProxy()
        view = clsView()
        print "\tDirect: ", str(self._testViewDirect(view, crashMethodName))
        view.close()
        self._closeModelAndProxy()

        self._initModelAndProxy()
        view = clsView()
        print "\tProxy: ", str(self._testViewProxy(view, crashMethodName))
        view.close()
        self._closeModelAndProxy()

    def _testViewDirect(self, view, crashMethodName):
        view.setModel(self._model)
        view.show()
        method = getattr(self._model, crashMethodName)
        if method():
            out = "OK"
        else:
            out = "NOK"
        return out

    def _testViewProxy(self, view, crashMethodName):
        view.setModel(self._proxy)
        view.show()
        method = getattr(self._model, crashMethodName)
        if method():
            out = "OK"
        else:
            out = "NOK"
        return out

app = QtGui.QApplication(sys.argv)

mt = myTest()

mt.testAllView()

mt.addObjectToData()
mt.testAllView()

sys.exit(app.exec_())
["Error_simple.py" (text/plain)]

from PyQt4 import QtGui
from PyQt4 import QtCore
import sys
import os

class myModel(QtCore.QAbstractItemModel):
    def __init__(self, parent=None):
        self._myDataStruct = None
        super(myModel, self).__init__(parent)

    def setDataStruct(self, myDataStruct):
        self._myDataStruct = myDataStruct

    def columnCount(self, parent=None):
        return 1

    def data(self, index, role):
        if index.isValid() and role == QtCore.Qt.DisplayRole:
            data = QtCore.QVariant(str(self.getMyObjectFromIndex(index)))
        else:
            data = QtCore.QVariant()        
        return data

    def flags(self, index):
        if not index.isValid():
            flags = QtCore.Qt.ItemIsEnabled
        else:
            flags = QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
        return flags

    def headerData(self, section, orientation, role):
        return QtCore.QVariant("header")

    def index(self, row, column, parent):
        if (parent is None) or (not parent.isValid()):
            parentNode = self._myDataStruct
        else:
            parentNode = self._myDataStruct.getMyObjectFromIndex(parent)
            if parentNode is None:
                parentNode = self._myDataStruct

        childNode = parentNode[row]
        if childNode is not None:
            return self.createIndex(row, column, id(childNode))
        else:
            return QtCore.QModelIndex()

    def parent(self, index):
        parentIndex = None
        if not index.isValid():
            parentIndex = QtCore.QModelIndex()
        else:
            childNode = self.getMyObjectFromIndex(index)
            if childNode is None:
                parentIndex = QtCore.QModelIndex()
            else:
                parentIndex = self.getIndexFromMyObject(self._myDataStruct)
        return parentIndex

    def rowCount(self, parent):
        if not parent.isValid():
            node = self._myDataStruct
        else:
            node = self.getMyObjectFromIndex(parent)
        return len(node)

    def getIndexFromMyObject(self, myObject):
        return self.createIndex(
            self._myDataStruct.getIndex(myObject),
            0,
            id(myObject))

    def getMyObjectFromIndex(self, index):
        return self._myDataStruct.getData(index.internalId())

    def methodFailed(self):
        QtGui.QDialog().exec_()
        print "first dialog ok"
        
        self.beginRemoveRows(QtCore.QModelIndex(), 0, 0)
        QtGui.QDialog().exec_()
        print "second dialog ok"

        self.endRemoveRows()
        QtGui.QDialog().exec_()
        print "third dialog ok"


class myDataStruct(object):
    def __init__(self):
        self._data = []
        self._dico = {}
    
    def __iter__(self):
        self._data.__iter__()

    def __getitem__(self, index):
        return self._data[index]
    
    def __len__(self):
        return len(self._data)

    def addData(self, myObjectToStore):
        self._data.append(myObjectToStore)
        self._dico[id(myObjectToStore)] = myObjectToStore
        
    def getData(self, id_):
        return self._dico[id_]
    
    def getIndex(self, myObject):
        return self._data.index(myObject)

class myObjectStored(object):
    def __init__(self):
        self._data = None

    def __len__(self):
        return 0

    def setData(self, data):
        self._data = data
    
    def __str__(self):
        return self._data



app = QtGui.QApplication(sys.argv)

Data = myDataStruct()

obj1 = myObjectStored()
obj1.setData("obj 1")
Data.addData(obj1)

model = myModel()
model.setDataStruct(Data)

proxy = QtGui.QSortFilterProxyModel()
proxy.setSourceModel(model)

#view = QtGui.QTableView() # <- Work
#view = QtGui.QListView() # <- Work
view = QtGui.QTreeView() # <- Crash
view.setModel(proxy)

view.show()

model.methodFaile()

obj2 = myObjectStored()
obj2.setData("obj 2")
Data.addData(obj2)

model.methodFaile()

sys.exit(app.exec_())

_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

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

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