Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. InsertRow
Forum Updated to NodeBB v4.3 + New Features

InsertRow

Scheduled Pinned Locked Moved Unsolved General and Desktop
32 Posts 5 Posters 5.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    Duy Khang
    wrote on last edited by Duy Khang
    #23

    @SGaist hi, how can I insert a row after the current row, assuming we don't have any rows at first, I use QSqlTableModel.

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #24

      The same as usual.

      As for setting the header data, it's shown in the QSqlTableModel documentation.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      1
      • D Offline
        D Offline
        Duy Khang
        wrote on last edited by
        #25

        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.

        JonBJ 1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #26

          What issue do you have with using insertRow ?

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          2
          • D Duy Khang

            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.

            JonBJ Offline
            JonBJ Offline
            JonB
            wrote on last edited by
            #27

            @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?

            1 Reply Last reply
            1
            • A Offline
              A Offline
              ArthurPYQT
              wrote on last edited by
              #28
              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?

              JonBJ 1 Reply Last reply
              0
              • A ArthurPYQT
                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?

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by
                #29

                @ArthurPYQT
                Since you call print(self.model.lastError().text()) both when insertRecord(0, r) succeeds and when it fails, do you want to tell us (actually prove) which route your code is following...?

                A 1 Reply Last reply
                1
                • JonBJ JonB

                  @ArthurPYQT
                  Since you call print(self.model.lastError().text()) both when insertRecord(0, r) succeeds and when it fails, do you want to tell us (actually prove) which route your code is following...?

                  A Offline
                  A Offline
                  ArthurPYQT
                  wrote on last edited by
                  #30

                  @JonB self.model.insertRecord(0, r) returns True, self.model.submitAll() returns False, self.model.lastError().text() returns "No fields to update"

                  A 1 Reply Last reply
                  0
                  • A ArthurPYQT

                    @JonB self.model.insertRecord(0, r) returns True, self.model.submitAll() returns False, self.model.lastError().text() returns "No fields to update"

                    A Offline
                    A Offline
                    ArthurPYQT
                    wrote on last edited by ArthurPYQT
                    #31

                    @ArthurPYQT I finally found the solution. it should be r=self.model.record() rather than r=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?

                    JonBJ 1 Reply Last reply
                    0
                    • A ArthurPYQT

                      @ArthurPYQT I finally found the solution. it should be r=self.model.record() rather than r=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?

                      JonBJ Offline
                      JonBJ Offline
                      JonB
                      wrote on last edited by JonB
                      #32

                      @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 a country_name column.

                      If you do this via QSqlRelationalTableModel and use a QSqlRelationalDelegate, 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).

                      1 Reply Last reply
                      2

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved