2010-01-30 16 views
1

Je travaille sur une application utilisant PyQt4 et le concepteur qu'elle fournit. J'ai une application de fenêtre principale qui fonctionne bien, mais je voulais créer des boîtes de dialogue de message personnalisé. J'ai conçu une boîte de dialogue et mis en place des connexions signal/slot personnalisées dans la méthode __init__ et j'ai écrit un if __name__=='__main__': et j'ai eu un test. Les emplacements personnalisés fonctionnent correctement. Toutefois, lorsque je crée une instance de ma boîte de dialogue à partir de mon application de fenêtre principale, aucun des boutons ne fonctionne. Voici ma boîte de dialogue:Les connexions QDialog PyQt4 ne sont pas effectuées

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
import sys 
import encode_dialog_ui 

# Ui_EncodeDialog is the python class generated by pyuic4 from the Designer 
class EncodeDialog(encode_dialog_ui.Ui_EncodeDialog): 

    def __init__(self, parent, in_org_im, txt_file, in_enc_im): 
     self.qd = QDialog(parent) 
     self.setupUi(self.qd) 
     self.qd.show() 
     self.message = (txt_file.split("/")[-1] + " encoded into " + 
      in_org_im.split("/")[-1] + " and written to " + 
      in_enc_im.split("/")[-1] + ".") 

     QObject.connect(self.view_image_button, SIGNAL("clicked()"), 
         self.on_view_image_button_press) 

     self.org_im = in_org_im 
     self.enc_im = in_enc_im 

     self.encoded_label.setText(self.message)  

    def on_view_image_button_press(self): 
     print "hello world" 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    tmp = QMainWindow() 
    myg = EncodeDialog(tmp,'flower2.png','b','flower.png') 
    app.exec_() 

Si je lance cette classe, il fonctionne très bien, et en appuyant sur les impressions view_image_button bonjour du monde à la console. Cependant, lorsque j'utilise l'appel

#self.mw is a QMainWindow, the rest are strings 
EncodeDialog(self.mw, self.encode_image_filename, 
      self.encode_txt_filename, 
      self.encode_new_image_filename) 

dans ma classe principale de la fenêtre, la fenêtre affiche correctement mais le view_image_button quand on clique dessus ne fait rien. J'ai cherché une solution, mais je n'ai rien trouvé d'utile. Faites-moi savoir si vous avez besoin de plus d'informations. Toute aide à ce sujet serait appréciée!

Comme demandé ci-dessous est un peu plus de code de ma classe de fenêtre principale par souci de brièveté J'ai ajouté des ellipses pour enlever le code qui semblait hors de propos. Si personne ne peut encore penser à quelque chose, j'en ajouterai d'autres. (Si indenter est un peu loin, il est arrivé à copier-coller. Le code Orignal est correct)

class MyGUI(MainWindow.Ui_MainWindow): 

    def __init__(self): 
     self.mw = QMainWindow() 
     self.setupUi(self.mw) 
     self.mw.show() 

     self.encode_red_bits = 1 
     self.encode_blue_bits = 1 
     self.encode_green_bits = 1 

     self.decode_red_bits = 1 
     self.decode_blue_bits = 1 
     self.decode_green_bits = 1 

     self.encode_image_filename = "" 
     self.encode_new_image_filename = "" 
     self.encode_txt_filename = "" 

     self.decode_image_filename = "" 
     self.decode_txt_filename = "" 

     # Encode events 
     ... 
     QObject.connect(self.encode_button, SIGNAL("clicked()"), 
         self.on_encode_button_press) 

     # Decode events 
     ... 


    # Encode event handlers 
    ... 

    def on_encode_button_press(self): 
     tmp = QErrorMessage(self.mw) 
     if (self.encode_image_filename != "" and 
      self.encode_new_image_filename != "" and 
      self.encode_txt_filename != ""): 


      try: 
       im = Steganography.encode(self.encode_image_filename, self.encode_txt_filename, 
              self.encode_red_bits, self.encode_green_bits, 
              self.encode_blue_bits) 
       im.save(self.encode_new_image_filename) 
       encode_dialog.EncodeDialog(self.mw, self.encode_image_filename, 
              self.encode_txt_filename, 
              self.encode_new_image_filename) 
      except Steganography.FileTooLargeException: 
       tmp.showMessage(self.encode_txt_filename.split("/")[-1] + 
           " is to large to be encoded into " + 
           self.encode_image_filename.split("/")[-1]) 

     else: 
      tmp.showMessage("Please specify all filenames.") 


    # Decode event handlers 
    ... 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    myg = MyGUI() 
    app.exec_() 
+0

Pouvez-vous poster plus de code de votre classe de fenêtre principale? Je ne vois rien de mal avec ce code ... - Aussi, en essayant d'écrire dans un fichier au lieu d'imprimer pour être sûr que * vraiment * n'appelle pas cette fonction –

+0

Ceci est un code simplifié. À l'origine, j'utilisais Image.show() (à partir de PIL) dans la fonction afin d'afficher une image pour le débogage, mais lorsque cela ne fonctionnait pas, je passais à une impression simple. Je vais essayer d'imprimer dans un fichier. Je vais ajouter un peu plus de code de la classe de la fenêtre principale ci-dessus. –

+0

J'ai essayé d'écrire dans un fichier, toujours pas de réponse. –

Répondre

0

Il se sent comme le signal est tout simplement pas se passer du parent vers le bas à votre enfant QDialog.

Essayez ces suggestions:

  1. Utilisez la nouvelle méthode pour les signaux de connexion
  2. Au lieu d'étendre les classes pyuic créées, étendre les classes QT réels et appeler ceux générés par pyuic

Votre nouveau code ressemblera à ceci:

class MyGUI(QMainWindow): 
     def __init__(self, parent=None): 
      QMainWindow.__init__(self, parent) 
      self.mw = MainWindow.Ui_MainWindow() 
      self.mw.setupUi(self) 
      self.mw.show() 
      ... 
      self.encode_button.clicked.connect(self.on_encode_button_press) 
      ... 

    class EncodeDialog(QDialog): 
     def __init__(self, parent, in_org_im, txt_file, in_enc_im): 
      QDialog.__init__(self, parent) 
      self.qd = encode_dialog_ui.Ui_EncodeDialog() 
      self.qd.setupUi(self) 
      self.qd.show() 
      ... 
      self.view_image_button.clicked.connect(self.on_view_image_button_press) 
      ... 
+0

Merci pour les idées, mais je ne reçois nulle part avec cela. Le problème est que Ui_EncodeDialog n'a pas de méthodes comme show() et QDialog n'a pas les boutons ou les étiquettes nécessaires. J'ai essayé de bidouiller avec, et je l'ai fait pour afficher la boîte de dialogue, mais les boutons ne fonctionnaient même pas en utilisant la méthode '__name __ =" __ main __ "'. Je vais continuer à jouer avec, mais je n'ai toujours pas de solution. Merci pour toute l'aide si! –