InsertRow
-
@Duy-Khang said in InsertRow:
do you know how to disable or turn off the these indexs in this picture ?
Hide the horizontal and vertical header.
wrote on 18 May 2021, 18:09 last edited by@Christian-Ehrlicher thank you.
-
@Duy-Khang
If that column is in the table but you don't want to show it, use void QTableView::hideColumn(int column) to suppress it in your view.Oh, I misunderstood what you were wanting to hide in your picture! I thought you meant the first column!
In which case it's the horizontal header as @Christian-Ehrlicher has pointed you to.
-
@Duy-Khang
If that column is in the table but you don't want to show it, use void QTableView::hideColumn(int column) to suppress it in your view.Oh, I misunderstood what you were wanting to hide in your picture! I thought you meant the first column!
In which case it's the horizontal header as @Christian-Ehrlicher has pointed you to.
-
What names do you want there ?
-
The same as usual.
As for setting the header data, it's shown in the QSqlTableModel documentation.
-
wrote on 19 May 2021, 19:06 last edited by
yes, i have done it and then how can I insert a row after the current row, assuming we don't have any rows at first, I use QSqlTableModel.
-
What issue do you have with using insertRow ?
-
yes, i have done it and then how can I insert a row after the current row, assuming we don't have any rows at first, I use QSqlTableModel.
wrote on 19 May 2021, 19:14 last edited by@Duy-Khang said in InsertRow:
how can I insert a row after the current row, assuming we don't have any rows at first
In addition to what @SGaist has been saying, how do you have a "current" row to insert after if you don't have any rows to start with?
-
wrote on 9 Nov 2022, 10:39 last edited by
import sys from PyQt5.QtWidgets import QWidget, QApplication,QTableView, QVBoxLayout,QPushButton from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel,QSqlRecord class demo(QWidget): def __init__(self): super().__init__() lyt = QVBoxLayout() self.setLayout(lyt) tview = QTableView() btn = QPushButton('add') lyt.addWidget(tview) lyt.addWidget(btn) db = QSqlDatabase.addDatabase("QSQLITE") db.setDatabaseName(r"xxx.db") self.model = testModel(db) tview.setModel(self.model) btn.clicked.connect(self.insertNewRecord) def insertNewRecord(self): r = QSqlRecord() r.setValue('name', 'hello') r.setValue('age', 23) if self.model.insertRecord(0, r): print(self.model.submitAll()) print(self.model.lastError().text()) else: self.model.db.rollback() print(self.model.lastError().text()) self.model.select() class testModel(QSqlTableModel): def __init__(self, db): super().__init__() self.db = db print(self.db.open()) self.setTable('test') self.setEditStrategy(QSqlTableModel.OnManualSubmit) print(self.select()) print(self.lastError().text()) print(self.tableName()) if __name__ == '__main__': app = QApplication(sys.argv) t = demo() t.show() sys.exit(app.exec())
data is displayed properly, but when i try to insertRecord, something wrong "No fields to update ". tableview not updated, let alone the database.
how to insert a record into the table?
-
import sys from PyQt5.QtWidgets import QWidget, QApplication,QTableView, QVBoxLayout,QPushButton from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel,QSqlRecord class demo(QWidget): def __init__(self): super().__init__() lyt = QVBoxLayout() self.setLayout(lyt) tview = QTableView() btn = QPushButton('add') lyt.addWidget(tview) lyt.addWidget(btn) db = QSqlDatabase.addDatabase("QSQLITE") db.setDatabaseName(r"xxx.db") self.model = testModel(db) tview.setModel(self.model) btn.clicked.connect(self.insertNewRecord) def insertNewRecord(self): r = QSqlRecord() r.setValue('name', 'hello') r.setValue('age', 23) if self.model.insertRecord(0, r): print(self.model.submitAll()) print(self.model.lastError().text()) else: self.model.db.rollback() print(self.model.lastError().text()) self.model.select() class testModel(QSqlTableModel): def __init__(self, db): super().__init__() self.db = db print(self.db.open()) self.setTable('test') self.setEditStrategy(QSqlTableModel.OnManualSubmit) print(self.select()) print(self.lastError().text()) print(self.tableName()) if __name__ == '__main__': app = QApplication(sys.argv) t = demo() t.show() sys.exit(app.exec())
data is displayed properly, but when i try to insertRecord, something wrong "No fields to update ". tableview not updated, let alone the database.
how to insert a record into the table?
wrote on 9 Nov 2022, 10:51 last edited by@ArthurPYQT
Since you callprint(self.model.lastError().text())
both wheninsertRecord(0, r)
succeeds and when it fails, do you want to tell us (actually prove) which route your code is following...? -
@ArthurPYQT
Since you callprint(self.model.lastError().text())
both wheninsertRecord(0, r)
succeeds and when it fails, do you want to tell us (actually prove) which route your code is following...?wrote on 10 Nov 2022, 01:11 last edited by@JonB
self.model.insertRecord(0, r)
returns True,self.model.submitAll()
returns False,self.model.lastError().text()
returns "No fields to update" -
@JonB
self.model.insertRecord(0, r)
returns True,self.model.submitAll()
returns False,self.model.lastError().text()
returns "No fields to update"wrote on 10 Nov 2022, 01:41 last edited by ArthurPYQT 11 Oct 2022, 05:14@ArthurPYQT I finally found the solution. it should be
r=self.model.record()
rather thanr=QSqlRecord()
. And I 'vd come up with a new question, is QSqlRelationalTableModel a must if I want to display data from two tables and write data back? -
@ArthurPYQT I finally found the solution. it should be
r=self.model.record()
rather thanr=QSqlRecord()
. And I 'vd come up with a new question, is QSqlRelationalTableModel a must if I want to display data from two tables and write data back?wrote on 10 Nov 2022, 08:32 last edited by JonB 11 Oct 2022, 08:33@ArthurPYQT
QSqlRelationalTableModel
is only for: if you have a foreign key relationship in your database between the two tables, it allows you to display to the user the "mapped" values for viewing/editing. Typical example:- Table A has its own PK plus other columns. One column is a
country_id
number. - That number is from Table B, which has
country_id
as its PK plus acountry_name
column.
If you do this via
QSqlRelationalTableModel
and use aQSqlRelationalDelegate
, it will show the "mapped" country name from Table B for the column in Table A which is the country id. And if you allow editing it will present the user with a combobox of all the country names in Table B to pick from when editing the column in Table A.However, it is not mandatory to use QSRTM. You can do viewing/updating with or without. Note that what I have described is all it does: people sometimes expect more of it. In particular, it does not have any support for editing the foreign key table (Table B).
- Table A has its own PK plus other columns. One column is a