====== Far interagire widget Qt di classi diverse ====== 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. \\ \\ ===== Metodo 0: usare i Signal e Slot di QT ===== 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. \\ \\ ==== Uno sguardo al costruttore della classe myForm ==== 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; } ===== Metodo 1: passare come parametri del costruttore della finestra secondaria i widget della finestra principale che verranno modificati ===== 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(); }