Home > Back-end >  Refresh/Re-open Qdialog with QTableWidget inside
Refresh/Re-open Qdialog with QTableWidget inside

Time:07-12

I have a program that is "divided" in 6 classes, the first class is the Main Window where I can choose where I'd like to go (I have 4 choices, a page to visualize all the data, one to modify and the other 2 to visualize data with filters), each of theese pages is a QDialog that contains a QTableWidget, this table is connected to a SQL Server database and shows data from a specific table (to be honest it shows data from 2 tables). My problem is: In the 2 class ("modificaviaggi") I connected some signals to some action, first of all I connected the itemChanged signal to a method that stores the items written by the user and saves them in the SQL DB, the signal signal I used is the clicked signal, I connected this signal to a method that verifies if the cell clicked it's the 8 or 9, in case it's 8 or 9 it shows another QDialog (class "articoli") where the user can insert some data regarding weight of every product, this weight data are stored in a second table in the SQL Server DB, I use this table to get the weight for every product when I show my table. So I get all the data from the table SQL "Viaggi" and then I verify if there are some values in the SQL table "Pesi" for each row of the table "Viaggi" using the row ID. Now the complicated part is that when the user click the columns 8 or 9 it shows another Qdialog, I show this Qdialog everytime the user clicks the columns 8 or 9, then the user can write data on the table and those data will be stored in the table "Pesi", thanks to the variable "lastID" declared on the "modificaviggi" class I know for which row the user clicked the columns 8 or 9, thanks to that I store the values in the SQL table and for each value I have their row ID, now that the situation is more clear the real question is: How can "Re-load" the QTableWidget "tabella_registrazioni" inside the class "modificaviaggi" everytime the user clicks the QPushButton "get_back_button"? Because in the class "articoli" the user modifies/adds values for each row in the QTableWidget "tabella_registrazioni" but I can't reload the data inside here's my code :

c = conn.cursor()    
d = conndue.cursor()
 
class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__() # chiamare le inherited classi con metodo __init__
        uic.loadUi('pagina_scelta.ui', self) # caricare file.ui
        self.show() # mostrarlo
        bottonefinestramodifica = self.findChild(QtWidgets.QPushButton, 'bottone_modifica')
        bottonefinestramodifica.clicked.connect(self.finestramodifica)
 
    def finestramodifica(self):
        self.finestramodifica = modificaviaggi()
        self.finestramodifica.show()
 
class MyDelegate(QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        return         
 
class modificaviaggi(QtWidgets.QDialog):
    lastid = [0]
    recall = [2]
    def finestraarticoli(self):
        self.finestraarticoli = articoli()
        self.finestraarticoli.show()
    def chiusura(self):
        self.accept()
    def __init__(self):
        super(modificaviaggi, self).__init__()
        uic.loadUi('modifica_reg.ui', self)
        bottonetorna = self.bottone_torna
        bottonetorna.clicked.connect(self.chiusura)
        self.reloading()
        self.datitabella()
    def reloading(self):
        if 1 == 1:
            if self.recall[0] == 1:
                self.datitabella()
                self.recall[0] == 2
    def datitabella(self):    
        delegate = MyDelegate(self)
        tablerow = 0 
        conteggio = c.execute('SELECT COUNT(ID) FROM Viaggi').fetchone()[0]
        print(conteggio)
        customers = [" "]
        self.tabella_registrazioni.blockSignals(True)
        self.customers_combo(customers)   
        self.tabella_registrazioni.setRowCount(conteggio)
        for row in c.execute("SELECT * FROM Viaggi "):
            rigavalore = 0
            self.tabella_registrazioni.setRowCount(conteggio)
            for r in range(0, 19):
                self.tabella_registrazioni.setItem(tablerow, rigavalore, QtWidgets.QTableWidgetItem(str(row[rigavalore])))
                rigavalore = 1
            tablerow = 1
            self.combocreation(customers)
        self.combocreation(customers)
        self.tabella_registrazioni.blockSignals(False)   
        self.tabella_registrazioni.itemChanged.connect(self.changeIcon) 
        self.tabella_registrazioni.setItemDelegateForColumn(0, delegate)
        self.tabella_registrazioni.clicked.connect(self.pressed)
        self.combo_customers.activated.connect(self.customer_combo_selection)
        righe = self.tabella_registrazioni.rowCount()
        tablerow1= 0
        for i in range(0, righe):
            idrow = self.tabella_registrazioni.item(i, 0).text()
            netweight = c.execute("SELECT SUM(Peso_netto) FROM Pesi WHERE ID_registrazione = ?", idrow)
            if netweight != None or not netweight.isspace():
                netweight = float(str(netweight.fetchone()[0]))
            else:
                print("Nessun peso")
            grossweight = c.execute("SELECT SUM(Peso_lordo) FROM Pesi WHERE ID_registrazione = ?", idrow)
            if grossweight != None or not grossweight.isspace():
                grossweight = float(str(grossweight.fetchone()[0]))
            self.tabella_registrazioni.setItem(tablerow1, 8, QtWidgets.QTableWidgetItem(str(netweight)))
            self.tabella_registrazioni.setItem(tablerow1, 9, QtWidgets.QTableWidgetItem(str(grossweight)))
            tablerow1 = 1
    def combocreation(self, customers):
        self.combo_customers = QComboBox()
        self.combo_customers.setEditable(True)
    def customers_combo(self, customers):
        for cu in d.execute("SELECT ANDESCRI FROM VALL_CONTI WHERE ANTIPCON = 'C' "):
                customers.append(cu[0].strip())
    def changeIcon(self, item):
        row = item.row()
        col = item.column()
        zero = self.tabella_registrazioni.item(row, 0).text()
        uno =  self.tabella_registrazioni.item(row, 1).text()
        custcode = self.tabella_registrazioni.item(row, 3).text()
        custname = self.tabella_registrazioni.item(row, 4).text() 
        c.execute('UPDATE Viaggi SET Codice_cliente = ?, Ragione_sociale = ? WHERE ID = ?', 
                                                (custcode, custname, zero))
        c.commit()
    def pressed(self, item):
        row = item.row()
        col = item.column()
        customers = [" "]
        self.lastid[0] = self.tabella_registrazioni.item(row, 0).text()
        if col == 8 or col == 9:
            self.finestraarticoli()
        self.customers_combo(customers)   
        self.combocreation(customers)
        textcell = self.tabella_registrazioni.item(row, col).text()
        self.combo_customers.setCurrentText(textcell)
        self.combo_customers.activated.connect(self.customer_combo_selection)
        if col == 3:
            self.tabella_registrazioni.setCellWidget(row, 3, self.combo_customers)
 
    def customer_combo_selection(self):
        customer_name = self.combo_customers.currentText()
        row = self.rrow
        self.tabella_registrazioni.setItem(self.rrow, self.ccolumn, QtWidgets.QTableWidgetItem(str(customer_name)))
        id = self.tabella_registrazioni.item(row, 0).text()
        c.execute("UPDATE Viaggi SET Ragione_Sociale=? WHERE ID = ?", (customer_name, id))
        c.commit()
 
class articoli(QtWidgets.QDialog):
    def changevariable(self):
        modificaviaggi.recall[0] = 1
        self.accept()
    def __init__(self):
        super(articoli, self).__init__()
        uic.loadUi('Inserimento_articoli.ui', self)
 
        self.get_back_button.clicked.connect(self.changevariable)
        self.tabellapesi()
    def tabellapesi(self):
        self.IDpressed = modificaviaggi.lastid
        tablerow = 0 
        self.tabella_articoli.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
        self.conteggio = int(str(c.execute("SELECT COUNT(ID_registrazione) FROM Pesi WHERE ID_registrazione = ? ", self.IDpressed[0]).fetchone()[0]))
        for row in c.execute("SELECT * FROM Pesi WHERE ID_registrazione = ? ORDER BY ID ", self.IDpressed[0]):
            rigavalore = 0
            self.tabella_articoli.setRowCount(self.conteggio)
            for r in range(0, 6):
                self.tabella_articoli.setItem(tablerow, rigavalore, QtWidgets.QTableWidgetItem(str(row[rigavalore])))
                rigavalore = 1
            tablerow = 1
 
    def insert(self):
        rows = self.tabella_articoli.rowCount()
        tablerow = 0
        for row in range (0, rows):
            articlecode = self.tabella_articoli.item(tablerow, 1).text()
            articledesc = self.tabella_articoli.item(tablerow, 2).text()
            netweight = float(self.tabella_articoli.item(tablerow, 3).text())
            grossweight  = float(self.tabella_articoli.item(tablerow, 4).text())
            price = float(self.tabella_articoli.item(tablerow, 5).text())
            if self.tabella_articoli.item(tablerow, 0) == None:
                IDweight = ""
            else:
                IDweight = int(self.tabella_articoli.item(tablerow, 0).text())
            queryinsert = "INSERT INTO Pesi ( Codice_articolo, Descrizione_articolo, Peso_netto, Peso_lordo, ID_registrazione, Prezzo) VALUES (?,?,?,?,?,?)"
            values = [articlecode, articledesc, netweight, grossweight, self.IDpressed[0], price]
            queryupdate = "UPDATE Pesi SET Peso_lordo = ?, Prezzo = ?, Peso_netto = ? , Codice_articolo = ?, Descrizione_articolo = ? WHERE ID = ? "
            valuesupdate = [grossweight, price, netweight, articlecode, articledesc, IDweight]           
            exist = str(c.execute("IF EXISTS (SELECT * FROM CARICO_VIAGGI..Pesi WHERE ID = ?) BEGIN SELECT 1 END ELSE BEGIN SELECT 2 END", (IDweight)).fetchone()[0])
            if exist == "1": 
                c.execute(queryupdate, valuesupdate)
                c.commit()
                print(type(IDweight))
            elif exist == "2":
                c.execute(queryinsert, values)
                c.commit()
            else:
                print("Impossibile salvare gli articoli, riprovare")
            tablerow = 1
        self.tabella_articoli.clearContents()
        tablerow = 0 
        self.conteggiox = int(str(c.execute("SELECT COUNT(ID_registrazione) FROM Pesi WHERE ID_registrazione = ? ", self.IDpressed[0]).fetchone()[0]))
        for row in c.execute("SELECT * FROM Pesi WHERE ID_registrazione = ? ORDER BY ID", self.IDpressed[0]):
            rigavalore = 0
            self.tabella_articoli.setRowCount(self.conteggiox)
            for r in range(0, 6):
                self.tabella_articoli.setItem(tablerow, rigavalore, QtWidgets.QTableWidgetItem(str(row[rigavalore])))
                rigavalore = 1
            tablerow = 1
 
app = QtWidgets.QApplication(sys.argv) 
window = Ui() 
app.exec_() 




    

CodePudding user response:

One solution could be to set up signals that would update the table as the user makes changes so there would be no need to refresh at all.

For example:

Set up a signal in your dialog class that will be emitted whenever the user changes the data. Then in the original dialog with the table you want to update, connect to that signal after initializing the dialog.

here is a minimal example:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

def populate_table(table):
    for i in range(10):
        table.insertRow(table.rowCount())
        for j in range(2):
            item = QTableWidgetItem(type=0)
            item.setText(f"({i}, {j})")
            table.setItem(i,j,item)

class Dialog2(QDialog):

    tableInfoChanged = pyqtSignal([int, int, str])

    def __init__(self,parent=None):
        super().__init__(parent=parent)
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.table = QTableWidget()
        self.table.setColumnCount(2)
        self.layout.addWidget(self.table)
        populate_table(self.table)
        self.table.cellChanged.connect(self.emitChangedInfo)

    def emitChangedInfo(self, row, col):
        text = self.table.item(row, col).text()
        self.tableInfoChanged.emit(row, col, text)


class Dialog1(QDialog):
    def __init__(self,parent=None):
        super().__init__(parent=parent)
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.table = QTableWidget()
        self.table.setColumnCount(2)
        self.button = QPushButton("Push to open dialog2")
        self.layout.addWidget(self.table)
        self.layout.addWidget(self.button)
        populate_table(self.table)
        self.button.clicked.connect(self.openDialog2)

    def updateTable(self, row, col, text):
        self.table.item(row,col).setText(text)

    def openDialog2(self):
        self.dialog2 = Dialog2()
        self.dialog2.tableInfoChanged.connect(self.updateTable)
        self.dialog2.exec()


app = QApplication(sys.argv)
window = Dialog1()
window.show()
sys.exit(app.exec_())

I have tested this code and should function as is.

  • Related