2012-01-05 21 views
8

Sto provando a collegare il segnale click() di un pulsante alla mia funzione. Il pulsante si trova in un widget che ho creato con QT Designer. I caricare il file .ui con QUiLoader in questo modo:Come implementare un segnale/slot definito in Qt Designer

class MyWidget(QtGui.QMainWindow): 
    def __init__(self, *args): 
     QtGui.QMainWindow.__init__(self, *args) 

     loader = QtUiTools.QUiLoader() 
     file = QtCore.QFile("pyside_ui_qtdesigner_form_test.ui") 
     file.open(QtCore.QFile.ReadOnly) 
     self.myWidget = loader.load(file, self) 
     file.close() 

     self.setCentralWidget(self.myWidget) 

     btn = self.myWidget.findChild(QtGui.QPushButton, "HelloWorldButton") 
     btn.clicked.connect(self.slot1)   

    def slot1(self): 
     print "Received" 

È questo il modo corretto per la connessione al pulsante cliccato del segnale()? Vedo che posso collegare segnali e slot direttamente in Qt Designer, ma come faccio a prepararmi e ad accedere a tali wire-up nel codice? Domanda laterale: il codice sopra funziona, ma la finestra principale mostra la dimensione sbagliata. Come posso assicurarmi che appaia con le giuste dimensioni? Dovrei farlo con i limiti minimi di altezza/larghezza?

risposta

12

Utilizzare Signals and Slots Editing Mode per collegare segnali Qt predefiniti direttamente agli slot Qt predefiniti.

Quindi, per il pulsante "Chiudi" in una finestra di dialogo semplice, è sufficiente trascinare una connessione dal pulsante alla finestra di dialogo, selezionare il segnale , fare clic su "OK" e non ci sarà più nulla da fare .

Per i segnali e/o gli slot che si desidera definire, non è necessario "preparare" nulla in Designer in anticipo. Tutto dovrebbe essere fatto nel tuo codice.

Il vostro esempio dimostra già questo abbastanza bene, ma la connessione potrebbe essere fatto molto più semplice e pulito, come questo:

self.myWidget.HelloWorldButton.clicked.connect(self.slot1) 

Per quanto riguarda la finestra principale con la "dimensione sbagliata": è difficile da raccontare dal codice che hai mostrato, ma potrebbe essere dovuto al fatto che non hai impostato un layout nel widget che stai caricando.

BTW: esiste un motivo specifico per cui si sta utilizzando QUiLoader? Compilare i moduli python usando pyuic4 è molto più flessibile e puoi imparare molto dal codice che viene generato.

EDIT

Per me, l'impostazione di un layout nella maschera principale cura il problema di ridimensionamento si sta parlando.

Se non si sa come farlo: in Designer, fare clic con il tasto destro del mouse su una parte vuota del modulo principale, quindi selezionare Layout/Layout in a Grid dal menu (c'è anche un pulsante sulla barra degli strumenti per questo).

Una volta fatto, il ridimensionamento del modulo lo allungherà automaticamente per adattarlo ai widget contenuti.

+0

Grazie funziona bene! Risolti i problemi relativi alle dimensioni, l'impostazione delle dimensioni minime in Qt Designer ha aiutato. Ho pensato che forse esiste un modo programmatico per garantire che la finestra principale sia dimensionata in modo che tutti i widget al suo interno siano visibili. – Sven

+0

Re QUiLoader, nessun motivo specifico, diverso da quello è semplice. Per l'approccio 'pyuic4', dovrò cercare come fare in modo che Eclipse/PyDev avvii' pyuic4' automaticamente per i file .ui. – Sven

+0

@Sven. Vedi la mia risposta aggiornata sul ridimensionamento: sono abbastanza sicuro che sia un problema di layout. – ekhumoro