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?

War es hilfreich?

Lösung

Ich habe, wie dies in der Vergangenheit getan, und ich kann sagen, es funktioniert. Ihre Taste angenommen wird "Button"

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top