Question

J'essaie d'utiliser pyqt pour afficher une fenêtre QDialog personnalisée lorsqu'un clic est effectué sur un bouton de QMainWindow. Je continue à avoir l'erreur suivante:

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

J'ai parcouru plusieurs didacticiels en ligne, mais la plupart d'entre eux ne montrent pas comment utiliser une fenêtre de dialogue non intégrée. J'ai généré le code pour la fenêtre principale et le dialogue en utilisant pyuic4. Ce que je pense devrait être le code pertinent est ci-dessous. Qu'est-ce qui me manque ici?

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

Question bonus: comme il semble que vous ne pouvez pas passer d’arguments dans les callbacks de la fonction pyqt, définissez quelque chose qui serait autrement transmis sous forme d’argument (le pseudonyme "c") doit être global, ce qui constitue le meilleur moyen d’obtenir des informations. dans ces fonctions?

Était-ce utile?

La solution

J'ai fait comme ça dans le passé, et je peux dire que ça marche. en supposant que votre bouton s'appelle "Bouton"

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

Cela fonctionne pour mon application et je pense que cela devrait également fonctionner avec la vôtre. J'espère que ça va aider, il devrait être assez simple de faire les quelques changements nécessaires pour l'appliquer à votre cas. bonne journée à tous.

Autres conseils

Ui_Dialog devrait être inhérent à QtGui.QDialog, pas à un objet.

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)

Pourquoi QtGui.QWidget .__ init ___ ??? Utiliser insted:

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

Vous devez appeler __ init __ methon à partir de la classe de base (nom entre parenthèses '()')

QDialog a deux routines utiles:

exec_()
show()

Attendez d’abord la fermeture du dialogue pour pouvoir accéder à n’importe quel dialogue de champ. Deuxième dialogue de dialogue, mais n’attendez pas. Pour fonctionner correctement, vous devez configurer certaines connexions slot / signal afin de répondre aux actions de dialogue.

par exemple. pour 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()

Petit conseil: pouvez-vous changer vos classes d'interface utilisateur en widgets (avec présentations). Et peut-être que le problème est que votre __ init __ doit être __ init __ (self, parent = None, dbConnection)

Parce que lorsque vous créez un nouveau widget dans un existant, PyQt peut essayer de le définir en tant qu'enfant d'un existant. (Changez donc toutes les init pour avoir un paramètre parent supplémentaire (doit être en deuxième position)).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top