Соединения PyQt4 QDialog не устанавливаются - PullRequest
1 голос
/ 30 января 2010

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

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 выводит hello world на консоль. Однако, когда я использую звонок

#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 ничего не делает при нажатии. Я гуглил решение, но не смог найти ничего полезного. Дайте мне знать, если вам нужна дополнительная информация. Любая помощь в этом будет оценена!

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

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

1 Ответ

0 голосов
/ 08 февраля 2010

Такое ощущение, что сигнал просто не передается от родителя к вашему ребенку 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)
            ...
...