Harjoituksessa tutkitaan kuinka sovellukseen lisätään uusi Form ja kuinka tietoa voidaan välittää formilta toiselle.
Uusi ikkuna voidaan avata metodeilla show ja exec. Näiden toiminta on seuraava
#include "secondform.h" #include "thirdform.h"
SecondForm *sf=new SecondForm(this); sf->show();Edellä SecondFormille annetaan argumenttina this, joka siis viittaa MainWindow luokan olioon. Tämän ansiosta oliota sf ei tarvitse tuhota, vaan se tuhoutuu automaattisesti, kun MainWindow olio tuhoutuu.
Huom! SecondForm-olio tuhoutuu vasta, kun MainWindow olio tuhotaan. Jos MainWindow:ta ei suljeta, niin joka kerta kun klikataan "Avaa SecondForm" luodaan uusi SecondForm olio. Tällöin kannattaa laittaa SecondForm olio tuhoutumaan, kun ikkuna suljetaan. Se voidaan tehdä seuraavalla koodilla:
SecondForm *sf=new SecondForm(this); sf->setAttribute(Qt::WA_DeleteOnClose); // Tuhoaa objektin kun ikkuna suljetaan sf->show();
explicit SecondForm(QString name, QWidget *parent = nullptr);Sanan SecondForm päällä Refactor->Apply Function Signature Changes (jolloin muutos tehdään myös cpp-tiedostoon)
ui->labelInfo->setText(name);
SecondForm *objectSecondForm=new SecondForm("Jussi",this);
objectSecondForm->show();
void ThirdForm::setNameFromMain(const QString &newNameFromMain)
{
nameFromMain = newNameFromMain;
ui->labelInfo->setText(nameFromMain);
}
ThirdForm *objectThirdForm=new ThirdForm(this);
objectThirdForm->setNameFromMain("Maija");
objectThirdForm->show();
Jos sinun pitää saada uudesta formista data näkymään alkuperäisessä formissa, kannattaa käyttää signal-slot systeemiä. Tässä konkreettinen esimerkki:
signals:
void dataSentBack(QString data);
void FourthForm::on_btnSendBack_clicked()
{
QString text = ui->lineEditName->text();
emit dataSentBack(text); // Lähetetään signaali
this->close(); // Suljetaan ikkuna
}
#include "fourthform.h"
// private slots osioon:
private slots:
void onDataReceivedFromFourth(QString data);
void MainWindow::on_btnOpenFourthForm_clicked()
{
FourthForm *fourthForm = new FourthForm(this);
fourthForm->setAttribute(Qt::WA_DeleteOnClose);
// Kytketään FourthForm:n signaali MainWindow:n slottiin
connect(fourthForm, &FourthForm::dataSentBack,
this, &MainWindow::onDataReceivedFromFourth);
fourthForm->show();
}
void MainWindow::onDataReceivedFromFourth(QString data)
{
ui->labelResult->setText("Sain takaisin: " + data);
qDebug() << "Data palautui:" << data;
}
Miten tämä toimii?
dataSentBack(text) kun käyttäjä klikkaa "Lähetä takaisin" -nappiaonDataReceivedFromFourth() suoritetaanSignal-slot järjestelmän edut: