2009-11-27 46 views
8

Ich versuche, Pyqt zu verwenden, um ein benutzerdefiniertes QDialog-Fenster anzuzeigen, wenn auf eine Schaltfläche in einem QMainWindow geklickt wird. Ich erhalte den folgenden Fehler:Öffnen Sie ein zweites Fenster in PyQt

$ 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' 

ich über mehrere Online-Tutorials gegangen sind, aber die meisten von ihnen halten nur kurz zu zeigen, wie eine nicht verwenden integrierte Dialogfenster. Ich habe den Code für das Hauptfenster und den Dialog mit pyuic4 generiert. Was ich denke, sollte der relevante Code sein. Was fehlt mir hier?

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() 

Bonus Frage: da es sieht aus wie Sie nicht Argumente in pyqt Funktion Rückrufen passieren können, etwas setzen, die sonst als Argument übergeben wird (die schlecht namens „c“) global zu dem besten Weg, um Informationen in diese Funktionen zu bekommen?

+0

'Ui_MainWindow .__ init__' hat ein Argument:' dbConnection', das Sie nicht zu übergeben scheinen: 'self.ui = Ui_MainWindow()' - Wie kann Ihr Code überhaupt funktionieren? – fviktor

+0

Whoops. Ich habe das Datenbankkram vorübergehend entfernt, um zu sehen, ob es irgendwie Teil des Problems war. Dann habe ich vergessen, den Code erneut zu kopieren und zu kopieren, nachdem ich ihn wieder eingefügt habe. – James

Antwort

16

Ich habe so in der Vergangenheit getan, und ich kann sagen, es funktioniert. Dies funktioniert für meine Anwendung Ihre Taste angenommen wird „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_() 

genannt, und ich glaube, es sollte auch mit Ihnen zu arbeiten. Ich hoffe, es wird Ihnen helfen, es sollte ziemlich geradlinig sein, die wenigen Änderungen zu tun, die nötig sind, um es auf Ihren Fall anzuwenden. Einen schönen Tag haben alle.

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

Warum QtGui.QWidget.__init___ ??? Verwendung insted:

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

Sie müssen __init__ Methon von Basisklasse aufrufen (Name in Klammern '()')

QDialog haben zwei nützliche routins:

exec_() 
show() 

Erste Warten auf Dialog zu schließen und dann können Sie auf jeden Feldformulardialog zugreifen. Zweiter Show-Dialog, aber warten Sie nicht, um richtig zu arbeiten, müssen Sie einige Slot/Signal-Verbindungen einrichten, um auf Dialogaktionen zu reagieren.

z. für 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() 

Kleinen Tipp: Sie können Ihre ui Klassen in Widgets ändern (mit Layout). Und vielleicht ist das Problem, dass Ihr __init__ sollte __init__(self, parent=None, dbConnection)

Da, wenn Sie ein neues Widget in bestehende eine PyQt möglicherweise versuchen, es als Kinder von bestehenden zu setzen. (Ändern Sie also alle Init, um einen zusätzlichen Elternparam zu haben (muss an der zweiten Position sein)).

+1

Ok. Aber mein Programm funktioniert immer noch genauso wie zuvor. Jede Idee, warum ich den Fehler "Descriptor '__init__' bekomme, erfordert ein 'sip.simplewrapper' Objekt, aber erhielt einen 'Ui_Dialog'", wenn ich versuche, ein zweites Fenster zu öffnen? – James

+0

Ok bearbeitet. Schauen Sie sich jetzt einen kleinen Tipp an. –

3

Ui_Dialog sollte von QtGui.QDialog inhärent sein, kein Objekt.

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