Unsolved Change color of a row of a QSqlQueryModel (QTableView)?
-
Yes, you 're right VRonin:
tableIter = self.m_extraRoles.constFind(hashKey)
This shows no underlined code in Pychrm (if there were any errors, it would be underlined. With red color.)
But this look very hard to convert to python:
Q_ASSERT(index.model()==this)
Q_ASSERT?? omg
-
You can actually remove that line altogether, it's just a check that is done only in debug mode
-
Only one (!!) line is left:
emit dataChanged(index,index,QVector<int>(1,role));
Translated to:
self.dataChanged.emit(index,index,QVector(int((1,role)))
But there is no QVector in Python.
(I mean it doesn't exist in any library like PyQt4.QtCore) -
Leave it with just
self.dataChanged.emit(index,index)
then. the last one is an optional parameter and even Qt's native models don't use it -
I set for source of the proxy model (ExtraRolesProxyModel) a QSqlQueryModel.
But I get an error:
'tableIter = self.m_extraRoles.constFind(hashKey)
AttributeError: 'ExtraRolesProxyModel' object has no attribute 'm_extraRoles' -
And this is the whole code (of the class):
class ExtraRolesProxyModel(QIdentityProxyModel ): def __init__(self, dbcursor=None): super(ExtraRolesProxyModel, self).__init__() def data(self, index, role): hashKey = index.row() << 32 | index.column() tableIter = self.m_extraRoles.constFind(hashKey) if tableIter==self.m_extraRoles.constEnd: return QtSql.QSqlQueryModel.data(index,role); roleIter = tableIter.value().constFind(role) if roleIter==tableIter.value().constEnd(): return QtSql.QSqlQueryModel.data(index,role); return roleIter.value() def setData(self, index, value, role=None): if not index.isValid(): return False hashKey = index.row() << 32 | index.column() if value: self.m_extraRoles[hashKey][role] = value self.dataChanged.emit(index,index) return True; tableIter = self.m_extraRoles.find(hashKey) if tableIter== self.m_extraRoles.end(): return False roleIter = tableIter.value().find(role) if roleIter==tableIter.value().end(): return False tableIter.value().erase(roleIter) if tableIter.value().isEmpty(): self.m_extraRoles.erase(tableIter) self.dataChanged.emit(index, index) return True
-
@Panoss said in Change color of a row of a QSqlQueryModel (QTableView)?:
AttributeError: 'ExtraRolesProxyModel' object has no attribute 'm_extraRoles'
You have to declare it in the
__init__
method (not sure how you deal with templates in python though)
@Panoss said in Change color of a row of a QSqlQueryModel (QTableView)?:
if tableIter==self.m_extraRoles.constEnd:
Missing ()
if value:
Does it work?
-
I made the suggested corrections:
if tableIter==self.m_extraRoles.constEnd():
And:
if value.isValid():
But I don't knw how to declare the m_extraRoles, so I declared it as list, which obviously, is incorrect.
class ExtraRolesProxyModel(QIdentityProxyModel ): def __init__(self, dbcursor=None): super(ExtraRolesProxyModel, self).__init__() self.m_extraRoles = []
(the '= []' means 'define it as list' )
-
you probably have to use a dict. Let's try this:
I do not know python so consider this just a guideline
class ExtraRolesProxyModel(QIdentityProxyModel ): def __init__(self, dbcursor=None): super(ExtraRolesProxyModel, self).__init__() self.m_extraRoles=dict() def data(self, index, role): hashKey = QByteArray() keyStream = QDataStream(hashKey,QIODevice::WriteOnly) keyStream.writeInt32(index.row()) keyStream.writeInt32(index.column()) keyStream.writeInt32(role) if self.m_extraRoles.has_key(hashKey): return self.m_extraRoles[hashKey] return QtSql.QSqlQueryModel.data(index,role) def setData(self, index, value, role=None): if not index.isValid(): return False hashKey = QByteArray() keyStream = QDataStream(hashKey,QIODevice::WriteOnly) keyStream.writeInt32(index.row()) keyStream.writeInt32(index.column()) keyStream.writeInt32(role) if value.isValid(): self.m_extraRoles[hashKey]=value self.dataChanged.emit(index,index) return True if self.m_extraRoles.has_key(hashKey): del self.m_extraRoles[hashKey] self.dataChanged.emit(index,index) return True return False
-
if self.m_extraRoles.has_key(hashKey):
AttributeError: 'dict' object has no attribute 'has_key'
But I see that dict does have an attributte named 'has_key'.
EDIT: in fact, it's been removed since python 3.
So I replaced:if self.m_extraRoles.has_key(hashKey):
with:
if hashKey not in self.m_extraRoles:
But now I get another error:
return self.m_extraRoles[hashKey]
KeyError: PyQt4.QtCore.QByteArray(b'\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x08')KeyError? What is this now?
EDIT:
I think hashKey has to be converted from QString to string.
I tried this:hashKey = unicode([PyQt4.QtCore.QString(u'hashKey')])
But this line returns me an error:
AttributeError: 'module' object has no attribute 'QString'