I 'm trying to 'translate' c++ to python.
With some help from qt forum, I got to this (it's compilable):
from PyQt4 import QtGui, QtCore, QtSql
from PyQt4.QtCore import QModelIndex, QByteArray, QDataStream, QIODevice
from PyQt4.QtGui import *
import sys
QString = type("")
from past.builtins import unicode
def main():
app = QtGui.QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
class MyWindow(QtGui.QTableView):
def __init__(self, *args):
QtGui.QTableView.__init__(self, *args)
# connect to db (if doesn't exist, it's auto-created)
self.db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
self.db.setDatabaseName('test.db')
self.db.open()
#create a table in db and add some data
query = QtSql.QSqlQuery()
query.exec_("DROP TABLE IF EXISTS games")
query.exec_("CREATE TABLE games(id INTEGER PRIMARY KEY, hometeam TEXT, visitorteam TEXT) ")
query.exec("INSERT INTO games (hometeam, visitorteam) VALUES ('Star', 'Eagles')")
query.exec("INSERT INTO games (hometeam, visitorteam) VALUES ('Best team', 'Reds');")
query.exec("INSERT INTO games (hometeam, visitorteam) VALUES ('NonWinners', 'Loosers');")
query.exec("INSERT INTO games (hometeam, visitorteam) VALUES ('North', 'South');")
query.exec("INSERT INTO games (hometeam, visitorteam) VALUES ('East', 'west');")
# set the model
model = QtSql.QSqlQueryModel(self)
model.setQuery("SELECT * FROM games")
# paint first two rows
for i in range(0, 2):
index = QtCore.QModelIndex(model.index(i, 0))
model.setData(index, QtCore.Qt.red, QtCore.Qt.BackgroundRole)
# create the proxy model
proxy_model = ExtraRolesProxyModel(self) # QtGui.QStandardItemModel(0, 2)
# set the proxy 's source
proxy_model.setSourceModel(model)
# set the proxy as TableView 's source
self.setModel(proxy_model)
class ExtraRolesProxyModel(QIdentityProxyModel):
def __init__(self, dbcursor=None):
super(ExtraRolesProxyModel, self).__init__()
self.m_extraRoles = dict()
def data(self, index, role):
if role == QtCore.Qt.BackgroundRole: role_str = "BackgroundRole"
if role == QtCore.Qt.DisplayRole: role_str = "DisplayRole"
print("ExtraRolesProxyModel data was called row=", index.row(), " role=", 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):
if hashKey in self.m_extraRoles:
hashKey = unicode([QString(u'hashKey')])
return self.m_extraRoles[hashKey]
return QIdentityProxyModel.data(self, index, role)
def setData(self, index, value, role=None):
print("ExtraRolesProxyModel setData was called=")
if not index.isValid():
return False
hashKey = QByteArray()
keyStream = QDataStream(hashKey, QIODevice.WriteOnly)
keyStream.writeInt32(index.row())
keyStream.writeInt32(index.column())
keyStream.writeInt32(role)
print("value=", value)
if value.isValid():
self.m_extraRoles[hashKey] = value
self.dataChanged.emit(index, index)
return True
#if self.m_extraRoles.has_key(hashKey):
if hashKey not in self.m_extraRoles:
del self.m_extraRoles[hashKey]
self.dataChanged.emit(index, index)
return True
return False
if __name__ == "__main__":
main()
The original c++ code for the class ExtraRolesProxyModel is this:
Q_OBJECT
Q_DISABLE_COPY(ExtraRolesProxyModel)
public:
explicit ExtraRolesProxyModel(QObject* parent=Q_NULLPTR)
:QIdentityProxyModel(parent)
{}
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE{
const qint64 hashKey = (static_cast<qint64>(index.row()) << 32) | static_cast<qint64>(index.column());
auto tableIter = m_extraRoles.constFind(hashKey);
if(tableIter==m_extraRoles.constEnd())
return QIdentityProxyModel::data(index,role);
auto roleIter = tableIter.value().constFind(role);
if(roleIter==tableIter.value().constEnd())
return QIdentityProxyModel::data(index,role);
return roleIter.value();
}
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) Q_DECL_OVERRIDE {
if(!index.isValid())
return false;
Q_ASSERT(index.model()==this);
const qint64 hashKey = (static_cast<qint64>(index.row()) << 32) | static_cast<qint64>(index.column());
if(value.isValid()){
m_extraRoles[hashKey][role] = value;
emit dataChanged(index,index,QVector<int>(1,role));
return true;
}
auto tableIter = m_extraRoles.find(hashKey);
if(tableIter==m_extraRoles.end())
return false;
auto roleIter = tableIter.value().find(role);
if(roleIter==tableIter.value().end())
return false;
tableIter.value().erase(roleIter);
if(tableIter.value().isEmpty())
m_extraRoles.erase(tableIter);
emit dataChanged(index,index,QVector<int>(1,role));
return true;
}
private:
QHash<qint64,QHash<qint32,QVariant> > m_extraRoles;
};
Well, python code does not make colored rows.
Can you spot any problems in the 'tranlsation'?