Я работаю над приложением с использованием 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_()
Можете ли вы разместить больше кода из класса основного окна? Я не вижу ничего плохого в этом коде ... - Кроме того, вы пытаетесь записать файл вместо печати, чтобы убедиться, что он действительно * не вызывает эту функцию. –
Это упрощенный код. Первоначально я использовал Image.show() (из PIL) в функции, чтобы показать изображение для отладки, но когда это не помогло, я переключился на простой шрифт. Я попробую распечатать файл. Я добавлю еще один код из класса главного окна выше. –
Я пробовал писать в файл, все еще не отвечаю. –