2013-07-02 2 views
0

Мне нужно вызвать форму (пользовательский диалог, созданный с помощью QtDesigner) через слот кнопки в главном окне (также в QtDesigned, отсюда отдельный файл). Ниже приведен соответствующий код:Невозможно вызвать специальный диалог из основного окна. PySide

def __init__(self, parent = None): 
    super(MainWindow, self).__init__(parent) 

    self.setupUi(self) 

    self.btn.clicked.connect(self.my_func) 


def my_func(self): 
    form = Form_UI.Custom_Dialog() 

    if form.exec_(): 
     print "successfully opened" 

Как всегда я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
File "F:\myPath\code.py", line 27, in my_func 
if form.exec_(): 
AttributeError: 'Custom_Dialog' object has no attribute 'exec_' 

Я не понимаю, потому что следующий код (с помощью встроенного в Dialog) работает просто отлично:

def __init__(self, parent = None): 
    super(MainWindow, self).__init__(parent) 

    self.setupUi(self) 

    self.btn.clicked.connect(self.my_func) 


def my_func(self): 
    form = QtGui.QDialog() 

    if form.exec_(): 
     print "successfully opened" 

Любая помощь будет оценена по достоинству. Заранее спасибо.

ответ

1

Класс, порожденный pyuic4 не вытекает из QDialog, так что если вы не пишете класс питона для этого Ui файла, как вы делали для главного окна, вам нужно создать QDialog объект и объект класса УИ:

def my_func(self): 
    form = QtGui.QDialog() 
    ui_form = Form_UI.Custom_Dialog() 
    ui_form.setupUi(form)  

    if form.exec_(): 
     print "successfully opened" 
+0

Удивительно, я очень ценю это. Спасибо. – Ryan

+0

Но, я должен спросить, какая будет лучшая практика (или конвенция), вывести ее в файл ui или настроить, как указано выше? – Ryan

+0

@Ryan Поскольку вы не можете редактировать сгенерированный файл, потому что любые изменения будут потеряны при вызове pyuic4 снова, я предполагаю, что вы имели в виду «... запись класса, который будет выводиться как из« QDialog », так и« Custom_Dialog »или для настройки как выше". Существует нет соглашения PyQt для выбора между этими двумя методами, кроме общего [«правила единой ответственности»] (http://en.wikipedia.org/wiki/Single_responsibility_principle), поэтому, в основном, если вам не нужно добавлять какие-либо логики для сгенерированного диалога (относительно сложное взаимодействие с пользователем или проверка ...), вышеуказанного кода должно быть достаточно. – alexisdm

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