Autore: Fabio Di Matteo
Ultima revisione: 26/03/2014
Di seguito alcune strategie per far interagire widget di classi diverse tra di loro.
Scenario: ho una finestra principale che apre una finestra generica nella quale c'è un pushButton che al click scrive qualcosa su un componente QLineEdit della finestra principale.
Prima di addentrarci nel nostro esempio vediamo come si usano gli Slot e i signal in Qt. Ecco un esempio esplicativo:
connect(sender,SIGNAL(signal),receiver,SLOT(slot));
dove sender è l'oggetto mandante il segnale signal (per esempio clicked()), receiver è l'oggetto che eseguira' la funzione slot .
Ecco la funzione relativa al click sul pulsante della finestra principale:
//Siamo nella finestra principale void MainWindow::on_cmdOpenWindow_clicked() { myForm *second =new myForm(); //creo un oggetto di tipo myForm(una semplice classe finestra creata con qtcreator ) //Al click del QPushButton mybt contenuto nella finestra second, eseguo ChangeButtonText() che è un membro di questa classe (MainWindow). connect(second->mybt,SIGNAL(clicked()),this,SLOT(ChangeButtonText())); second->show(); }
Dunque siamo nella finestra principale e creiamo un oggetto myForm di nome second. Dentro la finestra second c'è un pulsante di nome mybt dove al click
viene eseguita ChangeButtonText() che è un membro della classe MainWindow.
La classe myForm è una normalisima classe con l'unico accorgimento che il QPushButton myBt è un puntatore dichiarato come public ed associato al pulsante dell'interfaccia (creata con qtcreator) tramite questo codice contenuto nel costruttore di second:
myForm::myForm(QWidget *parent) : QWidget(parent), ui(new Ui::myForm) { ui->setupUi(this); //Variabile publica QPushButton *mybt; mybt=ui->mypushButton; }
Siamo nello SLOT clicked di un pushbutton della finestra principale. Al click verra instanziato l' oggetto per la seconda finestra:
void MainWindow::on_cmdpushButton_clicked() { // Con "ui->QLineEdit" passo il puntatore del mio QLineEdit al nuovo oggetto SecondWindow *wc= new SecondWindow(0,ui->QLineEdit); wc->show(); }
Il primo parametro del costruttore che è 0 ,nel nostro caso, è il puntatore al widget genitore, ovvero il widget dentro il quale si è disegnato.
Ora passiamo alla classe SecondWindow (implementazione del costruttore):
SecondWindow::SecondWindow(QWidget *parent, QLineEdit *w) : QWidget(parent), ui(new Ui::SecondWindow) { ui->setupUi(this); // La variabile tmpWidget è una variabile globale puntatore di tipo " QLineEdit* " // che nel nostro caso ci servira per lavorare con il QLineEdit dalla classe SecondWindow // a questo punto tmpWidget puntera' al nostro QLineEdit della finestra principale e // potremmo usarlo normalmente tmpWidget = w; }
Adesso sara' possibile interagire con il nostro QLineEdit della finestra principale . Ecco un esempio:
... void SecondWindow::on_pushButton_clicked() { // Al click di un pulsante sulla finestra secondaria // Scrivo "Ciao mondo!!!" nel nostro QLineEdit e chiudo SecondWindow tmpWidget->setText("Ciao mondo!!!"); this->close(); }
Il nostro wiki installa solamente cookie tecnici necessari al funzionamento della piattaforma "Dokuwiki". Niente analitics, statistiche, tracciamenti o altro.