Display a QGroupBox depending on two QComboBox contents

300 views Asked by At

For a database GUI application, I am trying to connect two QComboBox and a QGroupBox together. I am managed to connect the two QComboBox together but the code I wrote to connect the second QComboBox to the QGroupBox doesn't work.

With the first combobox, you can select a item in a first list of items. Depending on the item you choose, you get a another list of items, from the database, in the second combobox. What I want to do is to connect the second combobox to the groupbox so that when I choose an element, I get a particular display.

What have I done so far ? The element on the combobox are string. I found a function to get currentText of the combobox in a previous post. The second combobox is called self.liste_immeubles

def passtt(self,item):
    print(item)

and I get the combobox "self.liste_immeubles" current text value this way

self.liste_immeubles.activated[str].connect(self.passtt)

The problem I have is that it's only prints value. I am not able to fetch data with it. For example,

    caracteristiques =self.create_group(tab, "Caractéristiques") #creation a group called caracteristiques
    date_construction = self.create_line("Date de construction",140) #creation of a Label called date_construction, 140 matches the width
    date_construction_edit=self.create_line_edit(date_construction, caracteristiques) #creation of a LineEdit called date_construction_edit

    date1=self.db.requetes("SELECT date_construction FROM immeuble WHERE id_atelier="+str(self.id_atelier)+" AND adresse='"+self.liste_immeubles.activated[str].connect(self.passtt)+"';") #self.db is the database, requetes allow me to fetch data from self.db

I want data1 to be the text inside date_construction_edit. The issue is when I run the code, the gui app runs but the data is printed at the end, after I close the app. The data is not fetched.

I show you the code :

import os
import sys
import bdd
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication, QWidget, QProxyStyle
from PyQt5 import QtGui, QtCore
from PyQt5.QtCore import QObject, pyqtSignal

def apostrophe(nom):
if "'" in nom:
    a=nom.split("'")
    a=a[0]+"''"+a[1]
    return a
else:
    return nom

class TabWidget_(QWidget):
def __init__(self, id_atelier, parent=None):
    QWidget.__init__(self)
    super(TabWidget_,self).__init__(parent)
    self.id_atelier=id_atelier
    self.setLayout(QtWidgets.QVBoxLayout())
    self.liste_quartiers=QtWidgets.QComboBox()
    self.liste_immeubles=QtWidgets.QComboBox()
    self.dict_immeubles={}
    self.dict={}
    self.stackedwidget=QtWidgets.QStackedWidget()
    self.Onglets = QtWidgets.QTabWidget(self)
    self.Onglets.setFocusPolicy(QtCore.Qt.TabFocus)
    self.Onglets.setMovable(False)
    self.layout().addWidget(self.Onglets)
    self.db=bdd.Database()
    self.Tab_Synthese()
    self.adresse=""
    self.nouvliste=[]
    self.Tab_Immeuble()

    #self.Tab_Chantiers()
    #self.Tab_DEP()
    #self.Tab_Phototheque()


def create_group(self,nom_tab, nom_groupe):
    group=QtWidgets.QGroupBox(nom_tab)
    group.setTitle(nom_groupe)
    nom_tab.layout().addWidget(group)
    group.setLayout(QtWidgets.QFormLayout())
    return group

def create_line(self,nom_line, width=None):
    line = QtWidgets.QLabel()
    line.setText(nom_line)
    line.setFixedWidth(width)
    return line

def create_line_edit(self,nom_line,nom_groupe, width=250):
    line_edit=QtWidgets.QLineEdit(nom_groupe)
    line_edit.setFixedWidth(width)
    line_edit.setReadOnly(True)
    nom_groupe.layout().addRow(nom_line, line_edit)
    return line_edit


def Tab_Synthese(self):
    scrollArea = QtWidgets.QScrollArea() #pour faire défiler la page

    widget = QWidget() #ce widget contient tab. il est contenu dans scrollArea
    widget.setLayout(QtWidgets.QHBoxLayout())

    tab=QWidget(widget)#ce widget contient les groupes
    tab.setMaximumWidth(650)

    widget.layout().addWidget(tab, QtCore.Qt.AlignCenter)

    tab.setLayout(QtWidgets.QVBoxLayout())

    #Groupe COORDONNEES
    coordonnees = self.create_group(tab, "Coordonnées")

    #Eléments du groupe Coordonnées
    adresse=self.create_line("Adresse",140)
    adresse_edit= self.create_line_edit(adresse, coordonnees)
    adresse_edit.setText(self.db.requetes("SELECT adresse FROM Atelier WHERE id_atelier="+str(self.id_atelier)+";")[0][0])
    ville=self.create_line("Ville",140)
    ville_edit= self.create_line_edit("Ville", coordonnees)
    ville_edit.setText(self.db.requetes("SELECT ville FROM Atelier WHERE id_atelier="+str(self.id_atelier)+";")[0][0])
    code_postal = self.create_line("Code Postal", 80)
    code_postal_edit=self.create_line_edit(code_postal, coordonnees, 90)
    code_postal_edit.setText(str(self.db.requetes("SELECT code_postal FROM Atelier WHERE id_atelier="+str(self.id_atelier)+";")[0][0]))
    téléphone = self.create_line("Téléphone",140)
    téléphone_edit=self.create_line_edit(téléphone, coordonnees, 120)
    téléphone_edit.setText(self.db.requetes("SELECT tel FROM Atelier WHERE id_atelier="+str(self.id_atelier)+";")[0][0])

    #Groupe EQUIPE
    equipe =self.create_group(tab, "Equipe")

    #Eléments du groupe Equipe
    anim_tech = self.create_line("Animateur technique",140)
    anim_tech_edit= QtWidgets.QTreeWidget(equipe)
    anim_tech_edit.setHeaderLabels(["Nom et prénom"])
    nom_at=self.db.requetes("SELECT nom, prénom FROM Animateur_technique WHERE id_at IN (SELECT id_at from Jonction_Atelier_AT WHERE id_atelier="+str(self.id_atelier)+");")
    #child_elm=self.db.requetes("SELECT * from Jonction_Atelier_AT ;")
    #child_elm=self.db.requetes("SELECT * FROM Animateur_technique;")
    #print(child_elm)
    for i in nom_at:
        if i[0]!=None:
            elm=QtWidgets.QTreeWidgetItem([i[0]+' '+i[1]])
            child=self.db.requetes("SELECT présence FROM Jonction_Atelier_AT WHERE id_at IN (SELECT id_at FROM Animateur_technique WHERE nom='"+str(i[0])+"'AND prénom='"+str(i[1])+"') AND id_atelier="+str(self.id_atelier)+";")[0][0]
            elm.addChild(QtWidgets.QTreeWidgetItem(["présence : "+ child])) #il serait bien d'avoir les jours de présence
            anim_tech_edit.addTopLevelItem(elm)
    equipe.layout().addRow(anim_tech, anim_tech_edit)
    anim_tech_edit.setFixedWidth(250)
    anim_tech_edit.setFixedHeight(60)
    anim_hab = self.create_line("Animateur habitat", 140)
    anim_hab_edit=self.create_line_edit(anim_hab, equipe)

    anim_hab_edit.setText(" ".join(self.db.requetes("SELECT nom, prénom from Animateur_habitat WHERE id_ah IN (SELECT id_ah from Atelier WHERE id_atelier="+str(self.id_atelier)+");")[0]))

    #Groupe PATRIMOINE
    patrimoine = self.create_group(tab, "Patrimoine")

    #Eléments du groupe Patrimoine
    nb_immeubles = self.create_line("Nombre d'immeubles", 140)
    nb_immeubles_edit=self.create_line_edit(nb_immeubles, patrimoine)
    nb_immeubles_edit.setText(str(self.db.requetes("SELECT nb_immeubles FROM Atelier WHERE id_atelier="+str(self.id_atelier)+";")[0][0]))
    nb_logements  = self.create_line("Nombre de logements", 140)
    nb_logements_edit=self.create_line_edit(nb_logements, patrimoine)
    nb_logements_edit.setText(str(self.db.requetes("SELECT nb_logements FROM Atelier WHERE id_atelier="+str(self.id_atelier)+";")[0][0]))

    #Groupe BAIL
    bail = self.create_group(tab, "Autres")

    #Eléments du groupe Equipe
    date = self.create_line("Date d'ouverture", 140)
    date_edit= self.create_line_edit(date, bail)
    date_edit.setText(self.db.requetes("SELECT date_ouverture FROM Atelier WHERE id_atelier="+str(self.id_atelier)+";")[0][0])

    bailleurs_edit= QtWidgets.QTreeWidget()
    nom_bail=self.db.requetes("SELECT nom_bailleur FROM Bailleurs_sociaux WHERE id_bailleur IN (SELECT id_bailleur from jonction_bailleurs_contrats WHERE id_atelier="+str(self.id_atelier)+");")
    #print(nom_bail)
    cpt=1
    for i in nom_bail:
        elm=QtWidgets.QTreeWidgetItem(i)
        child_bail=self.db.requetes("SELECT nom_contrat FROM contrats WHERE id_contrat IN ( SELECT id_contrat from jonction_bailleurs_contrats WHERE id_atelier = "+str(self.id_atelier)+" AND id_bailleur IN (SELECT id_bailleur FROM Bailleurs_sociaux WHERE nom_bailleur ='"+i[0]+"' ) );")
        societe_bail=self.db.requetes("SELECT société FROM jonction_bailleurs_contrats WHERE id_atelier = "+str(self.id_atelier)+" AND id_bailleur IN (SELECT id_bailleur FROM Bailleurs_sociaux WHERE nom_bailleur ='"+i[0]+"' );")
        #print(societe_bail)
        if cpt==1:
            c_item=QtWidgets.QTreeWidgetItem(["Contrats"])
        cpt=cpt+1
        for child, societe in zip(child_bail,societe_bail):
            #print(child)
            c_item.addChild(QtWidgets.QTreeWidgetItem(["", child[0], societe[0]]))
        elm.addChild(c_item)
        bailleurs_edit.addTopLevelItem(elm)
    bailleurs_edit.setFixedWidth(390)
    bailleurs_edit.setHeaderLabels(["Bailleurs", "Contrats", "Société"])
    liste_id=self.db.requetes("SELECT DISTINCT id_atelier from jonction_bailleurs_contrats;")
    #print(liste_id)
    if [self.id_atelier] in liste_id:
        bail.layout().addRow(bailleurs_edit)


    #Groupe OBSERVATIONS -> ajouter tab_observations
    observations = self.create_group(tab, "Observations")
    text=QtWidgets.QTextEdit(observations)
    text.setMinimumHeight(200)
    text.setFixedWidth(390)
    observations.layout().addWidget(text)

    scrollArea.setWidget(widget)
    #scrollArea.setBackgroundRole(QtWidgets.QPalette.Dark)
    scrollArea.setWidgetResizable(True)
    #scrollArea.setFixedHeight(800)
    self.Onglets.addTab(scrollArea, "Synthèse")


def Tab_Immeuble(self):
    scrollArea = QtWidgets.QScrollArea()
    widget = QWidget()
    widget.setLayout(QtWidgets.QHBoxLayout())
    tab=QWidget(widget)
    tab.setMaximumWidth(700)
    tab.setLayout(QtWidgets.QFormLayout())
    widget.layout().addWidget(tab, QtCore.Qt.AlignCenter)


    quartiers=self.db.requetes("SELECT DISTINCT nom_quartier from immeuble where id_atelier="+apostrophe(str(self.id_atelier))+";")

    #Groupe CHOIX D'IMMEUBLE
    groupe_immeuble=self.create_group(tab, "Choix immeuble")
    groupe_immeuble.layout().addRow(self.liste_quartiers)
    groupe_immeuble.layout().addRow(self.liste_immeubles)
    groupe_immeuble.minimumSizeHint()

    for nom in quartiers:
        self.liste_quartiers.addItems(nom)
        liste_adresses=self.db.requetes("SELECT adresse from Immeuble where nom_quartier='"+apostrophe(str(nom[0]))+"';")
        self.dict_immeubles[str(nom[0])]=liste_adresses

    self.liste_quartiers.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)
    self.liste_quartiers.currentIndexChanged[str].connect(self.on_comboBoxParent_currentIndexChanged)
    self.liste_quartiers.setCurrentIndex(1)
    #text = str(self.liste_immeubles.currentText())
    #self.liste_immeubles.currentIndexChanged.connect(self.selectionchange)
    #self.liste_immeubles.activated[str].connect(self.onActivated)
    self.adresse=self.liste_immeubles.activated[str].connect(self.passtt)


    #GROUPE CARACTERISTIQUES
    caracteristiques =self.create_group(tab, "Caractéristiques")
    if self.adresse !=None:
        date_construction = self.create_line("Date de construction",140)
        date_construction_edit=self.create_line_edit(date_construction, caracteristiques)
        date1=self.db.requetes("SELECT date_construction FROM immeuble WHERE id_atelier="+str(self.id_atelier)+" AND adresse='"+apostrophe(self.adresse)+"';")
        if date1!=[]:
            date_construction_edit.setText(str(date1[0][0]))
        self.liste_immeubles.update()
        bailleur = self.create_line("Bailleur social", 140)
        bailleur_edit=self.create_line_edit(bailleur, caracteristiques)
        bailleur1=self.db.requetes("SELECT nom_bailleur FROM bailleurs_sociaux WHERE id_bailleur in (SELECT id_bailleur from immeuble WHERE id_atelier="+str(self.id_atelier)+" AND adresse='"+apostrophe(self.adresse)+"');")
        #print(bailleur1)
        if bailleur1!=[]:
            bailleur_edit.setText(bailleur1[0][0])
        self.liste_immeubles.update()
        nb_etages = self.create_line("Nombre d'étages", 140)
        nb_etages_edit=self.create_line_edit(nb_etages, caracteristiques, 60 )
        nb_logements  = self.create_line("Nombre de logements", 140)
        nb_logements_edit=self.create_line_edit(nb_logements, caracteristiques, 60)
        nbr1=self.db.requetes("SELECT nb_logements from immeuble WHERE id_atelier="+str(self.id_atelier)+" AND adresse='"+apostrophe(self.adresse)+"';")
        if nbr1!=[]:
            nb_logements_edit.setText(str(nbr1[0][0]))
        typologie = self.create_line("Typologie", 140)
        typologie_edit=self.create_line_edit(typologie, caracteristiques)
        type_chauffage  = self.create_line("Type de chauffage", 140)
        type_chauffage_edit=self.create_line_edit(type_chauffage, caracteristiques)
        emplacement_tableau_electrique  = self.create_line("Tableau électrique", 140)
        emplacement_tableau_electrique_edit=self.create_line_edit(emplacement_tableau_electrique, caracteristiques)
        emplacement_compteur_électrique  = self.create_line("Compteur électrique", 140)
        emplacement_compteur_électrique_edit=self.create_line_edit(emplacement_compteur_électrique, caracteristiques)
        #IF detecteur de fumée, alors on affiche
        #emplacement_détecteur_fumée  = self.create_line("Détecteur de fumée", 140)
        #emplacement_détecteur_fumée_edit=self.create_line_edit(emplacement_détecteur_fumée, caracteristiques)
        ascenseur = QtWidgets.QCheckBox("Ascenseur")
        interphone = QtWidgets.QCheckBox("Interphone")
        chauffage_au_sol=QtWidgets.QCheckBox("Chauffage au sol")
        détecteur_de_fumée=QtWidgets.QCheckBox("Détecteur de fumée") #Ne pas oublier de rajouter l'emplacement
        prise_de_terre=QtWidgets.QCheckBox("Prise de Terre")
        goulotte=QtWidgets.QCheckBox("Goulotte")
        caracteristiques.layout().addRow(ascenseur, interphone )
        caracteristiques.layout().addRow(chauffage_au_sol,détecteur_de_fumée)
        caracteristiques.layout().addRow(prise_de_terre,goulotte)

    scrollArea.setWidget(widget)
    scrollArea.setWidgetResizable(True)
    self.Onglets.addTab(scrollArea, "Immeuble")



def on_comboBoxParent_currentIndexChanged(self, nom):
    if nom in self.dict_immeubles:
        items = self.dict_immeubles[str(nom)]
        self.liste_immeubles.clear()
        for item in items:
            self.liste_immeubles.addItems(item)

def passtt(self,item):
    print(item)

#Chantiers_ARA
def Tab_Chantiers(self):
    widget=QWidget() #a enlever si on utilise pas qwidget
    chantiers = QtWidgets.QTreeView()
    #chantiers.setRootIsDecorated(True)
    #chantiers.setAlternatingRowColors(True)
    #chantiers.setMinimumHeight(580) #a enlever si on utilise pas qwidget
    layout=QtWidgets.QFormLayout() #a enlever si on utilise pas qwidget
    layout.addWidget(chantiers) #a enlever si on utilise pas qwidget
    widget.setLayout(layout) #a enlever si on utilise pas qwidget
    #self.Onglets.addTab(widget, "Chantiers Ara") # SEULEMENT CETTE LIGNE SUFFIT ! a enlever si on utilise pas qwidget
    self.Onglets.addTab(chantiers, "Chantiers Ara") #pour L'avoir sur toute la fenêtre

    model2 = self.createMailModel_chantiers(self)
    chantiers.setModel(model2)
    chantiers.header().setStretchLastSection(True);
    appart=self.db.requetes("SELECT * from chantiers_ara WHERE id_appartement in (SELECT id_appartement from Appartements WHERE id_atelier="+str(self.id_atelier)+");")

    for line in appart:
        id_c, date1, date2, date3, types, pièces, état, id_a, nom, immeuble=line
        if état:
            état=self.db.requetes("SELECT nom_état from etats_travaux WHERE id_état="+str(état)+";")[0][0]
        else:
            état=None
        if immeuble:
            immeuble=self.db.requetes("SELECT nom_quartier from immeuble WHERE id_immeuble="+str(immeuble)+";")[0][0]
        else:
            immeuble=None
        self.addMail_chantiers(model2, str(date1), str(date2), str(date3), str(types), str(état) , "appartement", str(nom), str(immeuble))
        #self.addMail_chantiers(model2, str(date1), str(date2), str(date3), str(types), str(état) , "appartement", str(nom), "immeuble")
        chantiers.header().setStretchLastSection(True);

    #chantiers.header()
    #chantiers.setSectionResizeMode(True)


def addMail_chantiers(self,model2, date_debut, date_signature, date_fin, type_chantier, etat_chantier, appartement, nom_prenom, immeuble ):
    model2.insertRow(0)
    model2.setData(model2.index(0, 0), date_debut)
    model2.setData(model2.index(0, 1), date_signature)
    model2.setData(model2.index(0, 2), date_fin)
    model2.setData(model2.index(0, 3), type_chantier)
    model2.setData(model2.index(0, 4), etat_chantier)
    model2.setData(model2.index(0, 5), appartement)
    model2.setData(model2.index(0, 6), nom_prenom)
    model2.setData(model2.index(0, 7), immeuble)

def createMailModel_chantiers(self,parent):
    model2 = QtGui.QStandardItemModel(0, 8, parent)
    model2.setHeaderData(0, QtCore.Qt.Horizontal, "Date première visite")
    model2.setHeaderData(1, QtCore.Qt.Horizontal, "Date signature")
    model2.setHeaderData(2, QtCore.Qt.Horizontal, "Date fin chantier")
    model2.setHeaderData(3, QtCore.Qt.Horizontal, "Type de travaux")
    model2.setHeaderData(4, QtCore.Qt.Horizontal, "Etat du chantier")
    model2.setHeaderData(5, QtCore.Qt.Horizontal, "Appartement")
    model2.setHeaderData(6, QtCore.Qt.Horizontal, "Nom et prénom")
    model2.setHeaderData(7, QtCore.Qt.Horizontal, "Immeuble")
    return model2


#Dépannages pédagogique
def Tab_DEP(self):
    widget=QWidget() #a enlever si on utilise pas qwidget
    dep = QtWidgets.QTreeView()
    #chantiers.setRootIsDecorated(True)
    #chantiers.setAlternatingRowColors(True)
    #chantiers.setMinimumHeight(580) #a enlever si on utilise pas qwidget
    layout=QtWidgets.QFormLayout() #a enlever si on utilise pas qwidget
    layout.addWidget(dep) #a enlever si on utilise pas qwidget
    widget.setLayout(layout) #a enlever si on utilise pas qwidget
    #self.Onglets.addTab(widget, "Dépannages pédagiques") # SEULEMENT CETTE LIGNE SUFFIT ! a enlever si on utilise pas qwidget
    self.Onglets.addTab(dep, "Dépannages pédagiques") #pour L'avoir sur toute la fenêtre

    model = self.createMailModel(self)
    dep.setModel(model)
    dépannages=self.db.requetes("SELECT * from dépannages_pédagogiques WHERE id_appartement in (SELECT id_appartement from Appartements WHERE id_atelier="+str(self.id_atelier)+");")
    for line in dépannages:
        id_d, date, nom, adresse, technique, participation, autonomie, suite,  commentaire,  appartement, id_immeuble=line
        if technique:
            technique=self.db.requetes("SELECT nom_technique from technique WHERE id_technique="+str(technique)+";")[0][0]
        else:
            technique=None
        if participation:
            participation=self.db.requetes("SELECT engagement from participation WHERE id_participation="+str(participation)+";")[0][0]
        else:
            participation=None
        if autonomie:
            autonomie=self.db.requetes("SELECT capacité from autonomie WHERE id_autonomie="+str(autonomie)+";")[0][0]
        else:
            autonomie=None
        if id_immeuble:
            immeuble=self.db.requetes("SELECT nom_immeuble from immeuble WHERE id_immeuble="+str(id_immeuble)+";")[0][0]
        else:
            immeuble=None
        self.addMail(model, str(date), str(nom), str(adresse), str(technique), str(participation) , str(autonomie), str(suite), str(commentaire),"appartement", str(immeuble))
        dep.header().setStretchLastSection(True);


def addMail(self,model, date, nom_prenom, adresse, technique, participation, autonomie, suite, appartement, immeuble, commentaires ):
    model.insertRow(0)
    model.setData(model.index(0, 0), date)
    model.setData(model.index(0, 1), nom_prenom)
    model.setData(model.index(0, 2), adresse)
    model.setData(model.index(0, 3), technique)
    model.setData(model.index(0, 4), participation)
    model.setData(model.index(0, 5), autonomie)
    model.setData(model.index(0, 6), suite)
    model.setData(model.index(0, 7), appartement)
    model.setData(model.index(0, 8), immeuble)
    model.setData(model.index(0, 9), commentaires)

def createMailModel(self,parent):
    model = QtGui.QStandardItemModel(0, 10, parent)
    model.setHeaderData(0, QtCore.Qt.Horizontal, "Date ")
    model.setHeaderData(1, QtCore.Qt.Horizontal, "Nom et prénom")
    model.setHeaderData(2, QtCore.Qt.Horizontal, "Adresse")
    model.setHeaderData(3, QtCore.Qt.Horizontal, "Technique")
    model.setHeaderData(4, QtCore.Qt.Horizontal, "Participation")
    model.setHeaderData(5, QtCore.Qt.Horizontal, "Autonome")
    model.setHeaderData(6, QtCore.Qt.Horizontal, "Suite")
    model.setHeaderData(7, QtCore.Qt.Horizontal, "Appartement")
    model.setHeaderData(8, QtCore.Qt.Horizontal, "Immeuble")
    model.setHeaderData(9, QtCore.Qt.Horizontal, "Commentaires")
    return model

self.liste_quartiers and self.liste_immeubles are the two QComboBox. The functions with the problem is Tab_Immeuble(self). self.adresse is an attribute which contains the fetched data. self.apostrophe is a function which allows to fetched data with apostrophes.

If you have any idea ? Thanks.

0

There are 0 answers