Search code examples
pythonqtdialogpyqtmodal-dialog

How can I show a PyQt modal dialog and get data out of its controls once its closed?


For a built-in dialog like QInputDialog, I've read that I can do this:

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

How can I emulate this behavior using a dialog that I design myself in Qt Designer? For instance, I would like to do:

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

Solution

  • Here is simple class you can use to prompt for date:

    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)
    

    and to use it:

    date, time, ok = DateDialog.getDateTime()