Skip to content

Instantly share code, notes, and snippets.

@eyllanesc
Created September 25, 2017 18:41
Show Gist options
  • Save eyllanesc/150e981878122e171bd25dc470781a87 to your computer and use it in GitHub Desktop.
Save eyllanesc/150e981878122e171bd25dc470781a87 to your computer and use it in GitHub Desktop.
import sys
from PyQt5 import QtCore, QtSql, QtWidgets, QtGui
class SqlTableModel(QtSql.QSqlTableModel):
ExecuteRole = QtCore.Qt.UserRole + 1
def __init__(self, parent=None, db = QtSql.QSqlDatabase()):
QtSql.QSqlTableModel.__init__(self, parent, db)
self.d = {}
def data(self, index, role):
if role == self.ExecuteRole:
_id = self.getId(index)
if _id in self.d.keys():
return self.d[_id]
return False
if role == QtCore.Qt.BackgroundRole:
if self.data(index, self.ExecuteRole):
return QtGui.QBrush(QtCore.Qt.red)
if 'MILESTONE' in QtSql.QSqlTableModel.data(self, self.index(index.row(), 2), QtCore.Qt.DisplayRole):
return QtGui.QBrush(QtCore.Qt.yellow)
return QtSql.QSqlTableModel.data(self, index, role)
def getId(self, index):
ix = self.fieldIndex("id")
return self.data(self.index(index.row(), ix), QtCore.Qt.DisplayRole)
def setData(self, index, value, role):
if role == self.ExecuteRole:
self.d[self.getId(index)] = value
return True
return QtSql.QSqlTableModel.setData(self, index, value, role)
def roleNames(self):
rn = QtSql.QSqlTableModel.roleNames(self)
rn[self.SelectRole] = QtCore.QByteArray(b'execute')
return rn
class TableView(QtWidgets.QTableView):
def contextMenuEvent(self, event):
pos = event.pos()
menu = QtWidgets.QMenu()
stepx = menu.addAction('Mark Step as Executed')
stepdx = menu.addAction('Clear Step Execution')
action = menu.exec_(self.mapToGlobal(pos))
if action == stepx:
if self.model():
index = self.model().index(self.rowAt(pos.y()), 2)
self.model().setData(index, True, SqlTableModel.ExecuteRole)
row = index.row()
self.model().dataChanged.emit(self.model().index(row, 0),
self.model().index(row, self.model().columnCount()-1),
[QtCore.Qt.BackgroundRole])
def createConnection():
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('memory')
if not db.open():
print("Cannot open database")
return False
query = QtSql.QSqlQuery()
query.exec_("create table person(id int primary key, "
"firstname varchar(20), lastname varchar(20),"
"archive BOOLEAN NOT NULL CHECK (archive IN (0,1)))")
query.exec_("insert into person values(101, 'Danny', 'MILESTONE', 1)")
query.exec_("insert into person values(102, 'Christine', 'Holand', 0)")
query.exec_("insert into person values(103, 'Lars', 'Gordon', 1)")
query.exec_("insert into person values(104, 'Roberto', 'MILESTONE', 0)")
query.exec_("insert into person values(105, 'Maria', 'MILESTONE', 1)")
query.exec_("insert into person values(106, 'Luisa', 'Papadopoulos', 1)")
query.exec_("insert into person values(107, 'Luis', 'Papadopoulos', 1)")
return True
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
if not createConnection():
sys.exit(1)
w = TableView()
model = SqlTableModel()
model.setTable("person")
model.select()
w.setModel(model)
w.show()
sys.exit(app.exec_())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment