0

I have two QTableView the first one with QSqlTableModel I have no probleme when I edit it s data using QDialog when double click event happened.

 self.table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
 self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
 self.table.doubleClicked.connect(self.editeParent)
 self.filter_proxy_model = QSortFilterProxyModel()
 self.filter_proxy_model.setSourceModel(self.parentsModel.model)
 self.filter_proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
 self.filter_proxy_model.setFilterKeyColumn(-1)
 self.table.setModel(self.filter_proxy_model)

The function 'edit Parent' open the dialog and set the data and then after editing return the new data to the database and QTableView updated but I can't do the same with the second one because it's related to the first one the second with QSqlRelationalTableModel that have relation to the first table

    tableModel = QSqlRelationalTableModel()
    tableModel.setTable("souparent")
    tableModel.setRelation(
        3, QSqlRelation("parent", "id", "name"))
    #tableModel.select()
    tableModel.setEditStrategy(QSqlTableModel.EditStrategy.OnManualSubmit)
    tableModel.select()
    headers = ("ID", "Name", "Note", "Parent")
    for columnIndex, header in enumerate(headers):
        tableModel.setHeaderData(columnIndex, Qt.Horizontal, header)
    return tableModel

    def getparent(self):
      query = QSqlQuery("SELECT id, name FROM parent ")
      query.exec()
      resul = []
      while query.next():
        resul.append([query.value(0), query.value(1)])
      return resul


    tableModel.setRelation(3, QSqlRelation("parent", "id", "name"))
    def updateParent(self, row, data):
        for column, field in enumerate(data):
            self.model.setData(self.model.index(row, column + 1), field)
            self.model.submitAll()
            self.model.select()

this is the model ans this is the view table

    self.table = QTableView()
    self.table.doubleClicked.connect(self.editeParent)
    # self.table.setModel(self.parentsModel.model)
    self.table.verticalHeader().hide()
    self.table.setSelectionBehavior(QAbstractItemView.SelectRows)

    # self.table.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)
    self.table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
    self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
    # search filter
    self.filter_proxy_model = QSortFilterProxyModel()
    self.filter_proxy_model.setSourceModel(self.souparentsModel.model)
    self.filter_proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
    self.filter_proxy_model.setFilterKeyColumn(-1)
    self.table.setModel(self.filter_proxy_model)
    #delegate = QSqlRelationalDelegate(self.table)

    #self.table.setItemDelegate(delegate)
    # self.table.resizeColumnsToContents()
    # Create buttons
        def editeParent(self):
    dialog = EditeDialog(self)
    row = self.table.currentIndex().row()
    indes = self.table.selectedIndexes()

    dialog.nameField.setText(str(indes[1].data()))
    dialog.noteField.setText(str(indes[2].data()))
    # dialog.parentlField.addItem(str(indes[3].data()))

    lista = self.souparentsModel.getparent()
    for list in lista:
        dialog.parentlField.addItem(list[1])
    dialog.parentlField.setCurrentText(indes[3].data())
    if dialog.exec() == QDialog.Accepted:
        data1 = dialog.nameField.text()
        data2 = dialog.noteField.text()
        data3 = dialog.parentlField.currentText()
        # print(data3)
        data4 = None
        for lisst in lista:
            if data3 in lisst:
                data4 = str(lisst[0])
                print(data4)
        data = [data1, data2, data4]

        print(data)
        self.souparentsModel.updateParent(row, data)

How can I write the function to edite each selected row with qdialog

I'm trying to edite row in my tableview with dialog

    def editeParent(self):
    dialog = EditeDialog(self)
    row = self.table.currentIndex().row()
    indes = self.table.selectedIndexes()

    dialog.nameField.setText(str(indes[1].data()))
    dialog.noteField.setText(str(indes[2].data()))
    # dialog.parentlField.addItem(str(indes[3].data()))

    lista = self.souparentsModel.getparent()
    for list in lista:
        dialog.parentlField.addItem(list[1])
    dialog.parentlField.setCurrentText(indes[3].data())
    if dialog.exec() == QDialog.Accepted:
        data1 = dialog.nameField.text()
        data2 = dialog.noteField.text()
        data3 = dialog.parentlField.currentText()
        # print(data3)
        data4 = None
        for lisst in lista:
            if data3 in lisst:
                data4 = str(lisst[0])
                print(data4)
        data = [data1, data2, data4]

        print(data)
        self.souparentsModel.updateParent(row, data)

What is the correct way to do that?

The scion
  • 1,001
  • 9
  • 19
hamza chenni
  • 146
  • 2
  • 18

0 Answers0