Öffnen Sie ein zweites Fenster, in PyQt
Ich versuche, pyqt, um zu zeigen Sie eine benutzerdefinierte QDialog-Fenster, wenn eine Taste auf einem QMainWindow geklickt wird. Ich erhalte die folgende Fehlermeldung:
$ 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 habe über mehrere online-tutorials, aber die meisten von Ihnen stoppen nur kurz zeigen, wie man mit einem nicht gebaut-im-dialog-Fenster. Ich habe den code generiert, sowohl für den Haupt-Fenster und der dialog mit pyuic4. Was ich denke, sollte der entsprechende code ist unten. Was vermisse ich 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 so aussieht, wie Sie nicht passieren können Argumente in pyqt und Funktions-callbacks, ist etwas, das würde anders werden als argument übergeben (die schlecht benannte "c"), um global sein, der beste Weg, um Informationen in die Funktionen?
Ui_MainWindow.__init__
hat ein argument:dbConnection
die Sie scheinen nicht zu passen:self.ui = Ui_MainWindow()
- Wie kann dein code überhaupt funktionieren?- Hoppla. Ich vorübergehend entfernt, die Datenbank Sachen midquestion um zu sehen, ob es war Teil des Problems irgendwie. Dann vergaß ich umkopieren und repaste den code, nachdem Sie es wieder in.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich getan habe, wie dies in der Vergangenheit, und ich kann sagen, es funktioniert.
vorausgesetzt dein button heißt "Button"
Dieser funktioniert für meine Anwendung, und ich glaube, es sollte die Zusammenarbeit mit Ihnen als gut. hoffe, es wird helfen, es ist ziemlich straight-forward zu tun, die wenigen änderungen, die notwendig ist, um es zu Ihrem Fall.
haben Sie einen guten Tag alle.
Ui_Dialog sollte inhärente aus QtGui.QDialog, nicht Objekt.
Warum
QtGui.QWidget.__init___
???Verwenden Sie stattdessen:
Rufen Sie
__init__
methon von der Basis-Klasse (Namen in Klammern '()')QDialog zwei nützliche routins:
Zunächst warten, bis das schließen-dialog und Sie können dann Zugriff auf alle Feld-form-dialog. Zweiten dialog anzeigen, aber nicht warten, so richtig zu arbeiten, müssen Sie einige slot/- Signale-verbindungen zu reagieren, für dialog-Aktionen.
zB. für exec_():
Kleiner Tipp: ändern Sie Ihre ui-Klassen in widgets (mit layouts). Und vielleicht problem ist, dass Ihr
__init__
sollte__init__(self, parent=None, dbConnection)
Weil, wenn Sie neue widget in bestehende PyQt und kann versuchen, es als Kinder bereits vorhandenen. (So ändern Sie alle init-zusätzliche param parent (muss auf der zweiten position)).