对于数据库 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 是一个允许使用撇号获取数据的函数。
如果你有任何想法?谢谢。