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.
Muchas gracias. Esto es exactamente lo que estaba buscando. – Thomas
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