Öffnen Sie ein zweites Fenster, in PyQt
Frage
Ich versuche, pyqt und zeigen ein benutzerdefiniertes 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 mich über mehrere online-tutorials, aber die meisten von Ihnen halten nur kurz zeigen, wie zu verwenden nicht den integrierten dialog-Fenster.Ich habe den code generiert sowohl für das Hauptfenster und den 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 sieht es aus wie Sie nicht passieren können Argumente in pyqt-Funktion Rückrufe, ist die Einstellung etwas, was sonst als argument übergeben (die schlecht mit der Bezeichnung "c") global der beste Weg, um Informationen in die Funktionen?
Lösung
Ich habe, wie dies in der Vergangenheit getan, und ich kann sagen, es funktioniert. Ihre Taste angenommen wird "Button"
genanntclass 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_()
Das funktioniert für meine Anwendung, und ich glaube, es sollte auch mit Ihnen zu arbeiten. Hilfe hoffen, es wird, sollte es ziemlich einfach sein, die wenigen Änderungen zu tun, brauchte es, um Ihren Fall zu übernehmen. haben einen guten Tag alle.
Andere Tipps
Ui_Dialog sollte inhärent von QtGui.QDialog, nicht widersprechen.
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)
Warum QtGui.QWidget.__init___
???Verwenden Sie stattdessen:
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
Sie müssen rufen __init__
methon von der Basis-Klasse (Namen in Klammern '()')
QDialog zwei nützliche routins:
exec_()
show()
Warten Sie zunächst, bis das schließen-dialog und Sie können dann den Zugriff auf beliebige Feld Formular-dialog.Zweite dialog anzeigen, aber nicht warten, also, um richtig zu arbeiten, müssen Sie einige slot/ - Signale der verbindungen zu reagieren, für die dialog-Aktionen.
zB.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()
Kleiner Tipp:können Sie ändern die ui-Klassen in widgets (mit Layout).Und vielleicht problem ist, dass Ihr __init__
sollte __init__(self, parent=None, dbConnection)
Weil, wenn Sie neue widget in bestehende PyQt können versuchen, set es als Kinder des vorhandenen.(So ändern Sie alle init zusätzliche übergeordnete param (muss auf der zweiten position)).