2009-11-27 21 views
8

Estoy intentando utilizar pyqt para mostrar una ventana QDialog personalizado cuando se hace clic en un botón en un QMainWindow. Sigo recibiendo el siguiente error:Abra una segunda ventana en PyQt

$ 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 repasado varios tutoriales en línea, pero la mayoría de ellos deje justo antes de que muestra cómo utilizar un no incorporado en la ventana de diálogo. Genere el código para la ventana principal y el diálogo utilizando pyuic4. Lo que creo que debería ser el código relevante está debajo. ¿Que me estoy perdiendo aqui?

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

Bono pregunta: ya que parece que no se puede pasar argumentos a las devoluciones de llamada de función PyQt, es establecer algo que de otro modo serían pasa como argumento (el mal llamado "c") a ser global la mejor manera para obtener información sobre esas funciones?

+0

'Ui_MainWindow .__ init__' tiene un argumento:' dbConnection' que no parece pasar: 'self.ui = Ui_MainWindow()' - ¿Cómo puede funcionar su código? – fviktor

+0

Whoops. Eliminé temporalmente las preguntas de la base de datos midquestion para ver si era parte del problema de alguna manera. Luego olvidé volver a copiar y volver a pasar el código después de ponerlo de nuevo. – James

Respuesta

16

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 debería funcionar con la tuya también. Espero que ayude, debería ser bastante directo hacer los pocos cambios necesarios para aplicarlo a su caso. tenga un buen día a todos.

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

¿Por qué QtGui.QWidget.__init___ ??? Uso insted:

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

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

QDialog tienen dos routins útiles:

exec_() 
show() 

Primera de espera para el cierre de diálogo y luego puede acceder a cualquier diálogo de formulario de campo. El segundo cuadro de diálogo muestra pero no espera, por lo que para que funcione correctamente debe establecer algunas conexiones de ranura/señal para responder a las acciones del 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: puede cambiar sus clases de interfaz de usuario en widgets (con diseños). Y tal vez su problema es que debe haber __init____init__(self, parent=None, dbConnection)

Debido al crear nuevo widget en uno ya existente PyQt puede tratar de establecerlo como hijos de uno ya existente. (Entonces cambie todo init para tener un param adicional padre (debe estar en la segunda posición)).

+1

Ok. Pero mi programa todavía funciona igual que antes. ¿Alguna idea de por qué obtengo el error "descriptor '__init__' requiere un objeto 'sip.simplewrapper' pero recibí un 'Ui_Dialog'" cuando intento abrir una segunda ventana? – James

+0

Ok editado. Ahora mira pequeño consejo. –

3

Ui_Dialog debe inherente de QtGui.QDialog, no objeto.

class Ui_Dialog(QtGui.QDialog): 
    def __init__(self, dbConnection): 
     QtGui.QDialog.__init__(self) 
     global c 
     c = dbConnection 
Cuestiones relacionadas