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