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. Model view insert row validation question isDirty()???
QtWS25 Last Chance

Model view insert row validation question isDirty()???

Scheduled Pinned Locked Moved General and Desktop
sqlmodel view progsqlrelationalta
8 Posts 2 Posters 2.7k Views
  • 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.
  • L Offline
    L Offline
    lukeQt
    wrote on last edited by lukeQt
    #1

    I have two sql relational tables and two delegates. The first model stores the recipes. The second table stores the join between recipe and ingredients. The second table has a proxy set to only show rows for each recipe. I am achieving this with a proxy model. This would be a left outer join.

    I have a sql relational table model with a delegate. What is the best way to prevent the user from adding more rows before the user specifies a value? I am using on manual submit. The first two columns are populated programmatically. The third column needs user input. I only want to submit the row once the user specifies a value. And I only want the user to be able to add a new row once the user defines the third column?

    Can I use isDirty() for this?

    self.join_model.dataChanged.connect(partial(self.submitrow, MissData = self.MissData))
    
    def submitrow(self, MissData):
        self.MissData = MissData
    
        # Do not evaluate value when GUI loads data on initalization
        if self.MissData == False:
            self.join_model.submitAll()
    
            # Set this to true because the user entered a value identical to another CFR
            self.MissData = True
    
        if self.join_model.lastError().isValid():
            #print self.join_model.lastError().text()
            if self.join_model.lastError().text() == "columns planning_obj_id, cfr_lu_id are not unique Unable to fetch row":
                self.join_model.revertAll()
                msg = "rows are not unique in the table"
                QtGui.QMessageBox.warning(self, "warning", msg, QtGui.QMessageBox.Ok)
                self.MissData = False
    
    
    
    def AddJoinRow(self):
            """this will allow one to add a row into the bottom model.
            This tool is a many to many relationship between recipes and ingrendents.
            Ingredients are popluated by the program. This is a many to many relationship.
            This tool has to models and two views the top model handles the recipes and
             the bottom model handles the ingredients.
            """
            ## recipe row count
            recipe_count = self.obj_model.rowCount()
            ## this is to test if there is at least one recipe id.
            if recipe_count == 0:
                msg = "you must add a recipe before you can add a row to the join table."
                QtGui.QMessageBox.warning(self, "warning", msg, QtGui.QMessageBox.Ok)
                return
            ## else there is at least one row in the recipe model.
            else:
                ## get the selected row in the recipe table.
                selected_index = self.obj_tableView.currentIndex()
                ## this tests if there is not a selected index in the recipe model.
                if not selected_index.isValid():
                    msg = "you must select a recipe row before adding a row in the "
                    QtGui.QMessageBox.warning(self, "warning", msg, QtGui.QMessageBox.Ok)
                    return
                ## else there is a selected index in the planning objective model.
                else:
                    ## get the row index of the selected recipe
                    row_index = selected_index.row()
                    max_id = 1
                    query = QtSql.QSqlQuery()
                    ##Query the join database table to get the max id
                    query.exec_("SELECT MAX(id) FROM join_recipe_ingredents")
                    if query.next():
                        max_id = query.value(0).toInt()[0]
    
                    ## query the recipe model to get the recipe id from the top model.
                    ## cannot use rowcount because a user can remove a row.
                    recipe_id = self.obj_model.data(self.obj_model.index(row_index, ID)).toInt()[0]
    
                    ## get the row count of the join table.
                    join_row = self.join_model.rowCount()
                    if join_row <4:
                        ## insert a row into the model.
                        self.join_model.insertRow(0)
                        ## set column 1 value to be the max id + 1
                        self.join_model.setData(self.join_model.index(0, JOIN_ID), max_id + 1)
                        ## set column 2 value to be the recipe_id
                        self.join_model.setData(self.join_model.index(0, PLANNING_ID), recipe_id)
                        ## column 3 is a combo box of all the ingrendents. I am using setRelation to populate this combobox.
    
                    else:
                        msg = "Cannot have more than 4 rows"
                        QtGui.QMessageBox.warning(self, "warning", msg, QtGui.QMessageBox.Ok)
    
    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi,

      Then why not use a dialog where you ask for the user input and only then update your database ?

      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
      0
      • L Offline
        L Offline
        lukeQt
        wrote on last edited by
        #3

        That seems harder. Shouldn't I be able to do this within the same table?

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

          Sure you can, but it's not the table's role to ask for more information if something is missing.

          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
          0
          • L Offline
            L Offline
            lukeQt
            wrote on last edited by
            #5

            Can I add a row to the model and only add it to the database when the user specifies a value? Isn't that what OnManualSubmit is for?

            1 Reply Last reply
            0
            • L Offline
              L Offline
              lukeQt
              wrote on last edited by
              #6

              Maybe I am not asking the right question. How do you wait for the user to input a value and only then call submitAll? It cant be in the add row method because that would only get called when the user pushes the button to add a row. I need to wait and allow the user to choose a value before submitAll is called.

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

                If you have e.g. a button to add a new row, have a custom slot connected to the button clicked signal and in that slot request input from the user and only once your have it, add the row.

                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
                0
                • L Offline
                  L Offline
                  lukeQt
                  wrote on last edited by
                  #8

                  Do you have an example of this?

                  1 Reply Last reply
                  0

                  • Login

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