¿Cómo puedo mostrar un diálogo modal de PyQt y obtener datos de sus controles una vez que se cierra?

Para un diálogo integrado como QInputDialog, leí que puedo hacer esto:

text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 'Enter your name:') 

¿Cómo puedo emular este comportamiento usando un diálogo que me diseño en Qt Designer? Por ejemplo, me gustaría hacer:

 my_date, my_time, ok = MyCustomDateTimeDialog.get_date_time(self) 

Aquí está la clase simple que puede usar para pedir la fecha:

 class DateDialog(QDialog): def __init__(self, parent = None): super(DateDialog, self).__init__(parent) layout = QVBoxLayout(self) # nice widget for editing the date self.datetime = QDateTimeEdit(self) self.datetime.setCalendarPopup(True) self.datetime.setDateTime(QDateTime.currentDateTime()) layout.addWidget(self.datetime) # OK and Cancel buttons buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) layout.addWidget(buttons) # get current date and time from the dialog def dateTime(self): return self.datetime.dateTime() # static method to create the dialog and return (date, time, accepted) @staticmethod def getDateTime(parent = None): dialog = DateDialog(parent) result = dialog.exec_() date = dialog.dateTime() return (date.date(), date.time(), result == QDialog.Accepted) 

y para usarlo:

 date, time, ok = DateDialog.getDateTime() 

Intenté editar la respuesta de hluk con los cambios a continuación, pero se rechazó, no estoy seguro de por qué, debido a que tengo algunos errores claros, puedo ver.

corrección de errores 1: auto eliminado . de self.layout.addWidget (self.buttons)

corrección de errores 2: conectó los botones Aceptar y Cancelar a sus acciones correctas

mejora: hizo que el código estuviera listo para ejecutarse al incluir las importaciones y mejoró el ejemplo de ejecución

 from PyQt4.QtGui import QDialog, QVBoxLayout, QDialogButtonBox, QDateTimeEdit, QApplication from PyQt4.QtCore import Qt, QDateTime class DateDialog(QDialog): def __init__(self, parent = None): super(DateDialog, self).__init__(parent) layout = QVBoxLayout(self) # nice widget for editing the date self.datetime = QDateTimeEdit(self) self.datetime.setCalendarPopup(True) self.datetime.setDateTime(QDateTime.currentDateTime()) layout.addWidget(self.datetime) # OK and Cancel buttons self.buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) layout.addWidget(self.buttons) self.buttons.accepted.connect(self.accept) self.buttons.rejected.connect(self.reject) # get current date and time from the dialog def dateTime(self): return self.datetime.dateTime() # static method to create the dialog and return (date, time, accepted) @staticmethod def getDateTime(parent = None): dialog = DateDialog(parent) result = dialog.exec_() date = dialog.dateTime() return (date.date(), date.time(), result == QDialog.Accepted) 

y para usarlo:

 app = QApplication([]) date, time, ok = DateDialog.getDateTime() print("{} {} {}".format(date, time, ok)) app.exec_()