Bonjour à tous
je vous livre le code suivant qui me pose quelques soucis.
Je suis en pleine phase d'apprentissage de Qt5 et je parcours assidument le livre créer des applications graphiques avec Qt5
j'ai reproduis un de leur code que j'ai aussi accomoder à ma sauce dans un autre projet et j'ai un drôle de résultat.
Dans le code ci dessous quand je quitte le fichier en faisant clique fichier clique quitter j'ai deux fois la demande de confirmation qui apparait. Chose que je n'ai pas en cliquant sur le X de fermeture de la fenêtre
Dans un autre projet en remplacant le triggered par clicked sur 2 tools buttons j'ai le même comportement su un des deux objets :s LE code utilisé à cette occasion est une projection du code ci dessous. Je suis très novice e QT5 beotien en OO amateur passionné découvrant python.
Merci


start_app.py

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
import sys
from PyQt5.QtWidgets import QApplication
from main_window_biblio import MainWindowBiblio
 
app=QApplication(sys.argv)
mainWindowBiblio=MainWindowBiblio()
mainWindowBiblio.show()
 
rc=app.exec_()
 
sys.exit(rc)
Ui_main_window_biblio.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# -*- coding: utf-8 -*-
 
# Form implementation generated from reading ui file 'C:\Users\chris\Documents\Script Python\main_window_biblio.ui'
#
# Created by: PyQt5 UI code generator 5.14.2
#
# WARNING! All changes made in this file will be lost!
 
 
from PyQt5 import QtCore, QtGui, QtWidgets
 
 
class Ui_MainWindowBiblio(object):
    def setupUi(self, MainWindowBiblio):
        MainWindowBiblio.setObjectName("MainWindowBiblio")
        MainWindowBiblio.resize(800, 722)
        self.centralWidget = QtWidgets.QWidget(MainWindowBiblio)
        self.centralWidget.setObjectName("centralWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralWidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.treeViewBd = QtWidgets.QTreeView(self.centralWidget)
        self.treeViewBd.setObjectName("treeViewBd")
        self.verticalLayout.addWidget(self.treeViewBd)
        self.groupBox = QtWidgets.QGroupBox(self.centralWidget)
        self.groupBox.setObjectName("groupBox")
        self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.lineEditTitreBD = QtWidgets.QLineEdit(self.groupBox)
        self.lineEditTitreBD.setObjectName("lineEditTitreBD")
        self.gridLayout.addWidget(self.lineEditTitreBD, 0, 1, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.groupBox)
        self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.comboBoxGenre = QtWidgets.QComboBox(self.groupBox)
        self.comboBoxGenre.setObjectName("comboBoxGenre")
        self.comboBoxGenre.addItem("")
        self.comboBoxGenre.addItem("")
        self.comboBoxGenre.addItem("")
        self.comboBoxGenre.addItem("")
        self.comboBoxGenre.addItem("")
        self.horizontalLayout.addWidget(self.comboBoxGenre)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.gridLayout.addLayout(self.horizontalLayout, 1, 1, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.groupBox)
        self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
        self.plainTextEditResume = QtWidgets.QPlainTextEdit(self.groupBox)
        self.plainTextEditResume.setObjectName("plainTextEditResume")
        self.gridLayout.addWidget(self.plainTextEditResume, 2, 1, 1, 3)
        self.label_4 = QtWidgets.QLabel(self.groupBox)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 3, 2, 1, 1)
        self.spinBox = QtWidgets.QSpinBox(self.groupBox)
        self.spinBox.setMaximum(5)
        self.spinBox.setObjectName("spinBox")
        self.gridLayout.addWidget(self.spinBox, 3, 3, 1, 1)
        self.verticalLayout.addWidget(self.groupBox)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem1)
        self.pushButtonNouveau = QtWidgets.QPushButton(self.centralWidget)
        self.pushButtonNouveau.setObjectName("pushButtonNouveau")
        self.horizontalLayout_2.addWidget(self.pushButtonNouveau)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem2)
        self.pushButtonSauvegarder = QtWidgets.QPushButton(self.centralWidget)
        self.pushButtonSauvegarder.setObjectName("pushButtonSauvegarder")
        self.horizontalLayout_2.addWidget(self.pushButtonSauvegarder)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem3)
        self.pushButtonSupprimer = QtWidgets.QPushButton(self.centralWidget)
        self.pushButtonSupprimer.setObjectName("pushButtonSupprimer")
        self.horizontalLayout_2.addWidget(self.pushButtonSupprimer)
        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem4)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        MainWindowBiblio.setCentralWidget(self.centralWidget)
        self.menuBar = QtWidgets.QMenuBar(MainWindowBiblio)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menuBar.setObjectName("menuBar")
        self.menu_Fichier = QtWidgets.QMenu(self.menuBar)
        self.menu_Fichier.setObjectName("menu_Fichier")
        MainWindowBiblio.setMenuBar(self.menuBar)
        self.action_Ouvrir = QtWidgets.QAction(MainWindowBiblio)
        self.action_Ouvrir.setObjectName("action_Ouvrir")
        self.action_Enregistrer = QtWidgets.QAction(MainWindowBiblio)
        self.action_Enregistrer.setObjectName("action_Enregistrer")
        self.action_Quitter = QtWidgets.QAction(MainWindowBiblio)
        self.action_Quitter.setObjectName("action_Quitter")
        self.menu_Fichier.addAction(self.action_Ouvrir)
        self.menu_Fichier.addAction(self.action_Enregistrer)
        self.menu_Fichier.addSeparator()
        self.menu_Fichier.addAction(self.action_Quitter)
        self.menuBar.addAction(self.menu_Fichier.menuAction())
 
        self.retranslateUi(MainWindowBiblio)
        QtCore.QMetaObject.connectSlotsByName(MainWindowBiblio)
 
    def retranslateUi(self, MainWindowBiblio):
        _translate = QtCore.QCoreApplication.translate
        MainWindowBiblio.setWindowTitle(_translate("MainWindowBiblio", "BiblioT"))
        self.groupBox.setTitle(_translate("MainWindowBiblio", "Details"))
        self.label.setText(_translate("MainWindowBiblio", "Titre"))
        self.label_2.setText(_translate("MainWindowBiblio", "Genre"))
        self.comboBoxGenre.setItemText(0, _translate("MainWindowBiblio", "Comics"))
        self.comboBoxGenre.setItemText(1, _translate("MainWindowBiblio", "---"))
        self.comboBoxGenre.setItemText(2, _translate("MainWindowBiblio", "Comics"))
        self.comboBoxGenre.setItemText(3, _translate("MainWindowBiblio", "Européenne"))
        self.comboBoxGenre.setItemText(4, _translate("MainWindowBiblio", "Manga"))
        self.label_3.setText(_translate("MainWindowBiblio", "Résumé"))
        self.label_4.setText(_translate("MainWindowBiblio", "Note"))
        self.pushButtonNouveau.setText(_translate("MainWindowBiblio", "Nouveau"))
        self.pushButtonSauvegarder.setText(_translate("MainWindowBiblio", "Sauvegarder"))
        self.pushButtonSupprimer.setText(_translate("MainWindowBiblio", "Supprimer"))
        self.menu_Fichier.setTitle(_translate("MainWindowBiblio", "&Fichier"))
        self.action_Ouvrir.setText(_translate("MainWindowBiblio", "&Ouvrir"))
        self.action_Ouvrir.setShortcut(_translate("MainWindowBiblio", "Ctrl+O"))
        self.action_Enregistrer.setText(_translate("MainWindowBiblio", "&Enregistrer"))
        self.action_Enregistrer.setShortcut(_translate("MainWindowBiblio", "Ctrl+S"))
        self.action_Quitter.setText(_translate("MainWindowBiblio", "&Quitter"))
 
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindowBiblio = QtWidgets.QMainWindow()
    ui = Ui_MainWindowBiblio()
    ui.setupUi(MainWindowBiblio)
    MainWindowBiblio.show()
    sys.exit(app.exec_())
main_window_biblio.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#main_window_biblio
from PyQt5.QtWidgets import QMainWindow
from Ui_main_window_biblio import Ui_MainWindowBiblio
from PyQt5.QtWidgets import QFileDialog,  QMessageBox
from PyQt5.QtCore import pyqtSlot,  QDate
from Ui_main_window_biblio import Ui_MainWindowBiblio
from modele_biblio import Livre, ModeleTableBiblio
 
class MainWindowBiblio(QMainWindow, Ui_MainWindowBiblio):
 
        def __init__(self, parent=None):
            super(MainWindowBiblio, self).__init__(parent)
            self.setupUi(self)
            livresTest =[Livre('XIII', 'Comics','', ''), Livre('Tintin', 'Européenne', '', '')]
            self.modeleTableBiblio = ModeleTableBiblio(livresTest)
            self.treeViewBd.setModel(self.modeleTableBiblio)
            self.treeViewBd.selectionModel().selectionChanged.connect(self.on_treeViewBd_selectionChanged)
 
        def on_treeViewBd_selectionChanged(self, selected, deselected):
            indexesSelection=selected.indexes()
            if len(indexesSelection)>0:
                self.indexSelection=indexesSelection[0]
                self.indiceLivreSelectionne=self.indexSelection.row()
                self.afficheLivre(self.modeleTableBiblio.livres[self.indiceLivreSelectionne])
 
        def afficheLivre(self, livre):
            self.lineEditTitreBD.setText(livre.titre)
            self.comboBoxGenre.setCurrentText(livre.genre)
            self.plainTextEditResume.setPlainText(livre.genre)
 
 
 
 
        @pyqtSlot()
        def on_action_Ouvrir_triggered(self):
            (nomFichierBiblio, filtre)= QFileDialog.getOpenFileName(self, "ouvrir fichier bibliotheque", filter="Bibliotheque (*.bib);;Tout(*.*)")
            if nomFichierBiblio:
                QMessageBox.information(self, "Trace", "Fichier à ouvrir:\n\n%s"%nomFichierBiblio)
 
        def on_action_Quitter_triggered(self):
            self.close()
 
        def closeEvent(self, event):
            messageConfirmation= "Etes vous sûr de quitter BibliApp ?"
            reponse=QMessageBox.question(self, "Confirmation", messageConfirmation, QMessageBox.Yes, QMessageBox.No)
            if reponse == QMessageBox.Yes:
                event.accept()
            else:
                event.ignore()
modele_biblio.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from PyQt5.QtCore import Qt, QAbstractTableModel, QModelIndex, QVariant
from collections import namedtuple
 
Livre = namedtuple('Livre', ('titre','genre','resume', 'prix') )
class ModeleTableBiblio(QAbstractTableModel):
    def __init__(self, livres):
        super(ModeleTableBiblio, self).__init__()
        self.titresColonnes=('titre','genre')
        self.livres=livres
    def headerData(self,section,orientation,role):
        if role == Qt.DisplayRole and orientation == Qt.Horizontal:
            return self.titresColonnes[section]
        return QVariant()
 
    def columnCount(self,parent):
        return len(self.titresColonnes)
 
    def rowCount(self,parent):
        return len(self.livres)
 
    def data(self,index,role):
        if role == Qt.DisplayRole and index.isValid():
            return (self.livres[index.row()][index.column()])
        return QVariant()
Merci encore pour aide et votre patience