2010-01-30 3 views
1

Я работаю над приложением с использованием PyQt4 и его дизайнером. У меня есть приложение для главного окна, которое отлично работает, но я хотел создать настраиваемые диалоговые окна сообщений. Я разработал диалог и установил некоторые пользовательские соединения сигналов/слотов в методе __init__ и написал if __name__=='__main__': и прошел тест. Пользовательские слоты работают нормально. Тем не менее, когда я создаю экземпляр моего диалога из моего приложения главного окна, ни одна из кнопок не работает. Вот мой диалог:PyQt4 Соединения QDialog не выполняются

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_() 

Если я запускаю этот класс он прекрасно работает, и нажав на view_image_button отпечатки привет мир на консоли. Однако, когда я использовать вызов

#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) 

в моем главном классе окна, диалоговые отображается правильно, но view_image_button ничего не делает при нажатии. У меня есть googled для решения, но не нашел ничего полезного. Дайте мне знать, если вам нужна дополнительная информация. Любая помощь по этому поводу будет оценена по достоинству!

Как уже было сказано ниже, еще один код из моего класса основного окна для краткости. Я добавил эллипсы для удаления кода, который казался несущественным. Если никто ничего не сможет придумать, я добавлю еще. (Если отступы немного прочь, это произошло в копировании оклейки. Оригинальный код правильный)

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

Можете ли вы разместить больше кода из класса основного окна? Я не вижу ничего плохого в этом коде ... - Кроме того, вы пытаетесь записать файл вместо печати, чтобы убедиться, что он действительно * не вызывает эту функцию. –

+0

Это упрощенный код. Первоначально я использовал Image.show() (из PIL) в функции, чтобы показать изображение для отладки, но когда это не помогло, я переключился на простой шрифт. Я попробую распечатать файл. Я добавлю еще один код из класса главного окна выше. –

+0

Я пробовал писать в файл, все еще не отвечаю. –

ответ

0

Такого ощущение, что сигнал просто не получает передаются от родителей вниз к вашему ребенку QDialog.

Попробуйте эти предложения:

  1. использовать новый метод для подключения сигналов
  2. Вместо расширения классов pyuic созданных, расширить фактические классы QT и вызывать те порожденный pyuic

Ваш новый код будет выглядеть примерно так:

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

Спасибо за идеи, но я никуда не с этим справляюсь. Проблема в том, что Ui_EncodeDialog не имеет таких методов, как show(), а QDialog не имеет необходимых кнопок или меток. Я пробовал работать с ним, и я получил его, чтобы отобразить диалог, однако кнопки даже не работали с использованием метода __name __ = «__ main __». Я буду продолжать играть с ним, но пока у меня все еще нет решения. Спасибо за помощь! –

Смежные вопросы