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_()
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 –
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. –
J'ai essayé d'écrire dans un fichier, toujours pas de réponse. –