2013-07-31 3 views
1

Bonjour Je travaille sur un programme d'archivage de données avec python 2.7. J'ai une fenêtre principale et il y a quelques éléments (Boutons, lignes de texte, etc.). Cliquez sur un bouton pour ouvrir une page de formulaire de dialogue. L'utilisateur sélectionne sa réponse sur cette page de dialogue. La page de dialogue a un bouton nommé 'enregistrer'. Lorsque vous cliquez sur Sauvegarder la boîte de dialogue du bouton Enregistrer les sélections de l'utilisateur dans la base de données. Je veux faire, lorsque l'utilisateur clique sur Enregistrer le bouton sur la boîte de dialogue, Il va activer certains éléments sur la mainWindow qui n'est pas activé. Je fais cela avec ces codes entrant dans la classe de dialogue et enregistrer fonction du bouton:Communication entre mianwindow et dialog en python

self.ui.onceBut.setEnabled (True) etc.

Mais je prends une erreur:

AttributeError: ' L'objet onceDlg 'n'a pas d'attribut' onceBut '

onceDlg est le nom de classe des pages de dialogue.

Comment puis-je résoudre ce problème et faire ce que je veux? Merci d'avance.

+0

La communication entre les composants de Qt se fait souvent en utilisant des signaux et des slots, mais ce n'est pas le seul moyen, et pour obtenir une bonne réponse, vous devrez poster plus de votre code. –

Répondre

0

self dans self.ui.onceBut.setEnabled(True) fait référence à boîte de dialogue, de sorte que vous obtenez une erreur parce que votre onceBut est dans votre boîte de dialogue mainWindow pas onceDlg.

Solution: comme le dit @Radio - Les communications entre composants dans Qt sont souvent effectuées en utilisant des signaux et des slots, mais ce n'est pas la seule façon. Il est plus facile de passer la fenêtre principale à la fenêtre de dialogue, de sorte que vous pouvez manipuler avec ses boutons, ou ce que vous voulez, dans la fenêtre de dialogue. Dans l'exemple suivant, j'ai fait cela à la ligne dialog = Dialog(self), où self fait référence à MainWindow et il est utilisé comme mainWin à l'intérieur Dialog. Exécutez-le, cliquez sur le premier bouton, la boîte de dialogue s'affichera, cliquez sur le bouton save dans la boîte de dialogue et le deuxième bouton dans le principal sera modifié et désactivé. J'espère que je vous ai aidé.

import sys 
from PyQt4 import QtCore, QtGui 

class Dialog(QtGui.QDialog): 
    def __init__(self, mainWin): 
     QtGui.QDialog.__init__(self,mainWin) 
     self.setWindowTitle(self.tr("Dialog window")) 
     self.main = mainWin 

     button = QtGui.QPushButton() 
     button.setText("Save (disable dummy button)") 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(button) 
     self.setLayout(layout) 

     self.connect(button, QtCore.SIGNAL("clicked()"), self.save) 
     self.resize(200, 100) 

    def save(self): 
     self.main.button2.setEnabled(False) 
     self.main.button2.setText("changed from dialog") 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.setWindowTitle(self.tr("Main window")) 

     self.button1 = QtGui.QPushButton() 
     self.button2 = QtGui.QPushButton() 
     self.button1.setText("Open dialog") 
     self.button2.setText("Dummy") 

     layout = QtGui.QVBoxLayout() 
     layout.addWidget(self.button1) 
     layout.addWidget(self.button2) 
     self.window = QtGui.QWidget() 
     self.window.setLayout(layout) 
     self.setCentralWidget(self.window); 

     self.connect(self.button1, QtCore.SIGNAL("clicked()"), self.showDialog) 
     self.resize(360, 145) 

    def showDialog(self): 
     dialog = Dialog(self) 
     dialog.show() 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    main = MainWindow() 
    main.show(); 
    sys.exit(app.exec_())