Barra laterale

programmazione:qt:far_interagire_widget_di_classi_diverse

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

programmazione/qt/far_interagire_widget_di_classi_diverse.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)