Pregunta

Estoy intentando usar pyqt para mostrar una ventana de QDialog personalizada cuando se hace clic en un botón en un QMainWindow. Sigo recibiendo el siguiente error:

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

He revisado varios tutoriales en línea, pero la mayoría de ellos no muestran cómo utilizar una ventana de diálogo no integrada. Generé el código tanto para la ventana principal como para el diálogo usando pyuic4. Lo que creo que debería ser el código relevante es el siguiente. ¿Qué me estoy perdiendo aquí?

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

Pregunta extra: ya que parece que no puede pasar argumentos en las devoluciones de llamadas de la función pyqt, es algo que, de lo contrario, se pasaría como un argumento (el mal llamado " c ") para que sea global la mejor manera de obtener información. en esas funciones?

¿Fue útil?

Solución

He hecho esto en el pasado, y puedo decir que funciona. asumiendo que su botón se llama "botón" "

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

Esto funciona para mi aplicación, y creo que también debería funcionar con la tuya. Espero que ayude, debería ser bastante sencillo hacer los pocos cambios necesarios para aplicarlo a su caso. que tengas un buen día a todos.

Otros consejos

Ui_Dialog debe ser inherente a QtGui.QDialog, no a objeto.

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)

¿Por qué QtGui.QWidget .__ init___ ??? Utilice insted:

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

Debe llamar al __init__ de la clase base (nombre entre paréntesis '()')

QDialog tiene dos rutinas útiles:

exec_()
show()

Primero espere a que se cierre el cuadro de diálogo y luego puede acceder a cualquier cuadro de diálogo de campo. En segundo lugar, muestre el cuadro de diálogo, pero no espere, por lo que para que funcione correctamente, debe configurar algunas conexiones de ranura / señales para responder a las acciones del cuadro de diálogo.

por ejemplo. para 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()

Pequeño consejo: ¿puedes cambiar tus clases de ui en widgets (con diseños)? Y quizás el problema es que su __init__ debería ser __init __ (self, parent = None, dbConnection)

Porque cuando crea un nuevo widget en uno existente, PyQt puede intentar establecerlo como hijos de uno existente. (Así que cambie todo init para tener un parámetro padre adicional (debe estar en la segunda posición)).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top