Domanda

Sto cercando di usare pyqt per mostrare una finestra QDialog personalizzata quando si fa clic su un pulsante in una QMainWindow. Continuo a ricevere il seguente errore:

$ python main.py 
DEBUG: Launch edit window
Traceback (most recent call last):
  File "/home/james/Dropbox/Database/qt/ui_med.py", line 23, in launchEditWindow
    dialog = Ui_Dialog(c)
  File "/home/james/Dropbox/Database/qt/ui_edit.py", line 15, in __init__
    QtGui.QDialog.__init__(self)
TypeError: descriptor '__init__' requires a 'sip.simplewrapper' object but received a 'Ui_Dialog'

Ho esaminato diversi tutorial online, ma la maggior parte di essi smette solo di mostrare come usare una finestra di dialogo non integrata. Ho generato il codice sia per la finestra principale che per la finestra di dialogo usando pyuic4. Quello che penso dovrebbe essere il codice pertinente è di seguito. Cosa mi sto perdendo qui?

class Ui_Dialog(object):
    def __init__(self, dbConnection):
        QtGui.QDialog.__init__(self)
        global c
        c = dbConnection

class Ui_MainWindow(object):
    def __init__(self, dbConnection):
        global c
        c = dbConnection

    def launchEditWindow(self):
        print "DEBUG: Launch edit window"
        dialog = QtGui.QDialog()
        dialogui = Ui_Dialog(c)
        dialogui = setupUi(dialog)
        dialogui.show()

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        conn = sqlite3.connect('meds.sqlite')
        c = conn.cursor()
        self.ui = Ui_MainWindow(c)
        self.ui.setupUi(self)

def main():
    app = QtGui.QApplication(sys.argv)
    program = StartQT4()
    program.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Domanda bonus: poiché sembra che non si possano passare argomenti nei callback della funzione pyqt, si sta impostando qualcosa che altrimenti verrebbe passato come argomento (il nome mal citato "quot" c ") per essere globale il modo migliore per ottenere informazioni in quelle funzioni?

È stato utile?

Soluzione

Ho fatto così in passato e posso dire che funziona. supponendo che il tuo pulsante sia chiamato " Button "

class Main(QtGui.QMainWindow):
    ''' some stuff '''
    def on_Button_clicked(self, checked=None):
        if checked==None: return
        dialog = QDialog()
        dialog.ui = Ui_MyDialog()
        dialog.ui.setupUi(dialog)
        dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        dialog.exec_()

Funziona con la mia applicazione e credo che dovrebbe funzionare anche con la tua. spero che ti sia d'aiuto, dovrebbe essere abbastanza semplice fare le poche modifiche necessarie per applicarlo al tuo caso. buona giornata a tutti.

Altri suggerimenti

Ui_Dialog dovrebbe essere inerente a QtGui.QDialog, non all'oggetto.

class Ui_Dialog(QtGui.QDialog):
    def __init__(self, dbConnection):
        QtGui.QDialog.__init__(self)
        global c
        c = dbConnection
class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

Perché QtGui.QWidget .__ init___ ??? Usa insted:

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

Devi chiamare __init__ methon dalla classe base (nome tra parentesi '()')

QDialog ha due routine utili:

exec_()
show()

Prima attendi la chiusura della finestra di dialogo e poi puoi accedere a qualsiasi finestra di dialogo del modulo di campo. Finestra di dialogo del secondo spettacolo ma non aspettare, quindi per funzionare correttamente è necessario impostare alcune connessioni slot / segnali per rispondere alle azioni di dialogo.

ad es. per exec_ ():

class Dialog(QDialog):
    def __init__(self, parent):
        QDialog.__init__(parent)
        line_edit = QLineEdit()
    ...

dialog = Dialog()
if dialog.exec_():   # here dialog will be shown and main script will wait for its closing (with no errors)
    data = dialog.line_edit.text()

Piccolo suggerimento: puoi cambiare le tue classi ui in widget (con layout). E forse il problema è che il tuo __init__ dovrebbe essere __init __ (self, parent = None, dbConnection)

Perché quando crei un nuovo widget in uno esistente, PyQt potrebbe provare a impostarlo come figlio di uno esistente. (Quindi cambia tutto init per avere parametri parent aggiuntivi (deve essere in seconda posizione)).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top