0

对于数据库 GUI 应用程序,我试图将两个 QComboBox 和一个 QGroupBox 连接在一起。我设法将两个 QComboBox 连接在一起,但我编写的将第二个 QComboBox 连接到 QGroupBox 的代码不起作用。

使用第一个组合框,您可以在第一个项目列表中选择一个项目。根据您选择的项目,您会在第二个组合框中从数据库中获得另一个项目列表。我想要做的是将第二个组合框连接到组框,这样当我选择一个元素时,我会得到一个特定的显示。

到目前为止我做了什么?组合框上的元素是字符串。我在上一篇文章中找到了一个获取组合框的 currentText 的函数。第二个组合框称为 self.liste_immeubles

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

我以这种方式获得组合框“self.liste_immeubles”当前文本值

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

我遇到的问题是它只打印价值。我无法用它获取数据。例如,

    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

我希望 data1 成为 date_construction_edit 中的文本。问题是当我运行代码时,gui 应用程序运行但数据在我关闭应用程序后最后打印。未获取数据。

我给你看代码:

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 和 self.liste_immeubles 是两个 QComboBox。有问题的函数是 Tab_Immeuble(self)。self.adresse 是一个包含获取数据的属性。self.apostrophe 是一个允许使用撇号获取数据的函数。

如果你有任何想法?谢谢。

4

0 回答 0