2

I have a PyQt5 Application connecting to a MySQL database. I made two views connected to the same model. The views pull in data from the database just fine. Any change I make to any field in one is reflected in the other. But it does not update the database. I tried leaving it idle for 15 minutes and it didn't update the database.

This is my code:

from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
from PyQt5.QtWidgets import QTableView, QApplication
import sys

app = QApplication(sys.argv)

db = QSqlDatabase.addDatabase("QMYSQL")
db.setHostName("localhost")
db.setDatabaseName("usrdb")
db.setUserName("usr")
db.setPassword("passwrd")
db.open()

testModel = QSqlTableModel()
qry = QSqlQuery("select * from test", db)
testModel.setQuery(qry)
testModel.setEditStrategy(QSqlTableModel.OnFieldChange)

testView = QTableView()
testtView.setModel(testModel)
testView2 = QTableView()
testView2.setModel(testModel)

testView.show()
testView2.show()

app.exec_()

The second problem I'm having is, once I change the data in one cell, the view doesn't let me edit the data in any other cell. They are selectable, but not editable.

askast
  • 73
  • 1
  • 6
  • Hmm, I don't know if I understand your question by the way it is worded. Have you tried using `QTableWidget` instead of `QTableView`? – ham-sandwich May 15 '15 at 09:36
  • The second view was just to check if the model was being updated, which it is. The issue is that changes in the model aren't being committed to the database. How do i connect QTableWidget to my QSqlTableModel? it says setModel() is a private method. – askast May 15 '15 at 14:51

1 Answers1

2

Fixed both my problems. pyqt documentation advices not to use setQuery.

You should normally not call it(setQuery) on a QSqlTableModel. Instead, use setTable(), setSort(), setFilter(), etc., to set up the query.

Updated code:

from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
from PyQt5.QtWidgets import QTableView, QApplication
import sys

app = QApplication(sys.argv)

db = QSqlDatabase.addDatabase("QMYSQL")
db.setHostName("localhost")
db.setDatabaseName("usrdb")
db.setUserName("usr")
db.setPassword("passwrd")
db.open()

testModel = QSqlTableModel()
testModel.setTable("test")
testModel.setEditStrategy(QSqlTableModel.OnFieldChange)
testModel.select()

testView = QTableView()
testtView.setModel(testModel)

app.exec_()

This updates the database as soon as the edits are made, and also lets me do multiple edits on a view.

askast
  • 73
  • 1
  • 6