====== 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();
}