I’m started to learning Qt4 Model/View Programming and I have beginner question.
I have simple application which show sqlite table in QTableView:
class Model(QtSql.QSqlTableModel):
def __init__(self, parent=None):
super(Model, self).__init__(parent)
self.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
self.setTable("test")
self.select()
class App(QtGui.QMainWindow):
def __init__(self, model):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.tableView.setModel(model)
if __name__ == "__main__":
myDb = QtSql.QSqlDatabase.addDatabase("QSQLITE")
myDb.setDatabaseName("test.db")
if not myDb.open():
print 'FIXME'
model = Model()
app = QtGui.QApplication(sys.argv)
window = App(model)
window.show()
sys.exit(app.exec_())
Here how database looks like:
sqlite> create table test (a INTEGER, b INTEGER, c STRING);
sqlite> insert into test VALUES(1, 2, "xxx");
sqlite> insert into test VALUES(6, 7, "yyy");
So I’m getting something like:
+---+---+-----+
| a | b | c |
+---+---+-----+
| 1 | 2 | xxx |
+---+---+-----+
| 6 | 7 | yyy |
+---+---+-----+
Is it possible to modify Model to have in QTableView something like virtual column? For example something like:
+---+---+-----+-----+
| a | b | sum | c |
+---+---+-----+-----+
| 1 | 2 | 3 | xxx |
+---+---+-----+-----+
| 6 | 7 | 13 | yyy |
+---+---+-----+-----+
Or maybe I should do it in some other way?
Yes, you can do that. Although @BrtH’s answer is relevant, models are tricky and it’s easy to get lost. So I thought a more case in point example would be better.
Personally, I’d use a proxy model derived from
QAbstractProxyModel. But, in your case reimplementingQSqlTableModelis also feasible. Below is an implementation for your goal. Note that, it’s essential for you to know basics of Model/View methodology so that you understand what each method does.