2011-04-22 9 views
8

Estoy intentando agregar un cuadro de diálogo personalizado a mi GUI actual que se puede iniciar para que el usuario configure algunos parámetros. Idealmente, me gustaría crear el diálogo personalizado usando QtDesigner. A continuación se muestra el código generado por pyuic4 del código de usuario de QtDesigner para el cuadro de diálogo.PyQt4: Crear un cuadro de diálogo personalizado que devuelva los parámetros

from PyQt4 import QtCore, QtGui 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName("Dialog") 
     Dialog.resize(508, 300) 
     self.buttonBox = QtGui.QDialogButtonBox(Dialog) 
     self.buttonBox.setGeometry(QtCore.QRect(150, 250, 341, 32)) 
     self.buttonBox.setOrientation(QtCore.Qt.Horizontal) 
     self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) 
     self.buttonBox.setObjectName("buttonBox") 
     self.label = QtGui.QLabel(Dialog) 
     self.label.setGeometry(QtCore.QRect(10, 120, 181, 31)) 
     font = QtGui.QFont() 
     font.setPointSize(16) 
     self.label.setFont(font) 
     self.label.setObjectName("label") 
     self.sl_value = QtGui.QSlider(Dialog) 
     self.sl_value.setGeometry(QtCore.QRect(220, 120, 161, 31)) 
     self.sl_value.setOrientation(QtCore.Qt.Horizontal) 
     self.sl_value.setObjectName("sl_value") 
     self.ed_value = QtGui.QLineEdit(Dialog) 
     self.ed_value.setGeometry(QtCore.QRect(400, 120, 41, 31)) 
     font = QtGui.QFont() 
     font.setPointSize(16) 
     self.ed_value.setFont(font) 
     self.ed_value.setObjectName("ed_value") 
     self.retranslateUi(Dialog) 
     QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), Dialog.accept) 
     QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), Dialog.reject) 
     QtCore.QMetaObject.connectSlotsByName(Dialog) 


    def retranslateUi(self, Dialog): 
     Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) 
     self.label.setText(QtGui.QApplication.translate("Dialog", "Set example value:", None, QtGui.QApplication.UnicodeUTF8)) 

Esto se guarda en Sub2.py Entonces, en mi archivo principal pitón, agrego

from Sub2 import Ui_Dialog 

creo una nueva clase llamada StartSub2 con el siguiente código

class StartSub2(QtGui.QDialog): 
    def __init__(self,parent=None): 
     QtGui.QDialog.__init__(self,parent) 
     self.ui = Ui_Dialog 
     self.ui.setupUi(self) 

Entonces, finalmente, Dentro de mi GUI principal hay una función con el siguiente código que debe iniciar el diálogo

def exampleSubGui(self): 
    dialog = StartSub2(self) 
    result = dialog.exec_() 

Tenga en cuenta que el cuadro de diálogo no está hecho. Una vez que haya resuelto cómo lanzarlo, agregaré conexiones de señal/ranura para el control deslizante y el cuadro de edición. Además, si lo entiendo correctamente, necesito sobrecargar el método accept() para devolver la entrada del usuario.

El primer problema que encuentro es con el método __init__ de StartSub2. Me sale el siguiente error:

TypeError: unbound method setupUi() must be called with Ui_Dialog instance as 
first argument (got StartSub2 instance instead) 

Estoy intentando tomar el mismo enfoque que la GUI principal está tomando el cual utiliza el siguiente código

class StartQT4(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

Pero esto no se queja de setupUi() conseguir un StartQT4 instancia en lugar de una instancia Ui_MainWindow. ¿Alguien puede explicar la forma correcta de lograr lo que estoy tratando de hacer? ¿O alguien puede señalarme un claro ejemplo o referencia? Por favor, avíseme si necesita más información o aclaraciones.

Respuesta

17
class StartSub2(QtGui.QDialog, Ui_Dialog): 
    def __init__(self,parent=None): 
     QtGui.QDialog.__init__(self,parent) 
     self.setupUi(self) 

debe resolver su primer problema para obtener el cuadro de diálogo para inicializar.

para obtener información de vuelta Yo suelo añadir un método llamado algo así como getValues-StartSub2, es decir

def getValues(self): 
    return somethingUseful 

luego hacer

dlg = StartSub2() 
if dlg.exec_(): 
    values = dlg.getValues() 
    # Do stuff with values 
+0

Muchas gracias. Esto es exactamente lo que estaba buscando. – Thomas

+0

Merece la pena señalar que esto no funcionará si self.close() el cuadro de diálogo (como el valor devuelto por .exec() es 0), tiene que self.accept(). Esto no me fue del todo claro al principio de la sintaxis SIGNAL de la vieja escuela en la pregunta. – Taran

Cuestiones relacionadas