2013-08-12 9 views
11

Per un dialogo built-in come QInputDialog, ho letto che io possa fare questo:Come posso mostrare una finestra di dialogo modale PyQt e ottenere i dati dai suoi controlli una volta chiuso?

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

Come posso emulare questo comportamento utilizzando una finestra di dialogo che mi progettare in Qt Designer? Per esempio, mi piacerebbe fare:

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

risposta

21

Ecco semplice classe è possibile utilizzare per richiedere per la data:

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) 

e di utilizzarlo:

date, time, ok = DateDialog.getDateTime() 
+0

Può spiegare perché si utilizza il '@ staticmethod' decorat o, e perché hai scelto di istanziare la classe 'DateDialog' all'interno della definizione della classe' DateDialog'? Ho trovato questo un po 'di confusione. – wesanyer

+0

@wesanyer Vero. Puoi usare la funzione semplice per creare la finestra di dialogo e ottenere il risultato che è migliore (se non hai bisogno di riutilizzare la classe di dialogo). Inoltre potrebbe restituire solo l'oggetto 'date' e restituire 'Nessuna' o generare un'eccezione se la finestra di dialogo è stato cancellato (non sono sicuro quale sia la soluzione giusta in Python). – hluk

+0

Per chiunque non lo sappia, QDialog può essere importato come segue: 'da PyQt4.QtGui importa QDialog' (assumendo che tu stia usando PyQt versione 4) – MD004

25

ho cercato di modifica la risposta di hluk con le modifiche di seguito ma è stata rifiutata, non è sicuro il motivo per cui è stato possibile vedere alcuni bug chiari.

bugfix 1: rimosso self. da self.layout.addWidget (self.buttons)

bugfix 2: collegate OK e Annulla pulsanti per le sue azioni corrette

enhancement: reso il codice pronto per essere eseguito includendo importazioni e migliorato la corsa esempio

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) 

e di utilizzarlo:

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