Qt-ohjelmointi
Datan välitys

Harjoituksessa tutkitaan kuinka sovellukseen lisätään uusi Form ja kuinka tietoa voidaan välittää formilta toiselle.

show(), open(), exec()

Uusi ikkuna voidaan avata metodeilla show, open ja exec. Näiden toiminta on seuraava

  • show avaa uuden ikkunan "ei modaalina" eli aiempaa ikkunaa voidaan edelleen käyttää
  • open ja exec avaavat uuden ikkunan modaalina
Siis open ja exec avaavat uuden ikkunan modaalina. Niiden ero on siinä, että exec luo uuden event loopin, mutta open ei. Lisäksi open palauttaa voidin ja exec kokonaisluvun.

  1. Tee uusi Qt Widget projekti (nimeltään sendData) ja muokkaa sen ui kuva1:n mukaiseksi. Nimeä buttonit btnOpenSecondForm ja btnOpenThirdForm ja luo niille clicked eventit
  2. Klikkaa hiiren oikealla painikkeella kansiota Forms ja valitse Add New->Qt->Qt Designer Form Class->Widget ja anna nimeksi SecondForm
    Muokkaa ui kuva2:n mukaiseksi ja nimeä kontrollit seuraavasti
    • labelInfo
  3. Tee samalla tavalla vielä toinen Form, jonka nimi on ThirdForm
    Muokkaa ui kuva3:n mukaiseksi ja nimeä kontrollit seuraavasti
    • labelInfo
  4. Lisää mainwindow.h tiedoston alkuun rivit
    #include "secondform.h"
    #include "thirdform.h"
    
  5. Kirjoita mainwindow:ssa btnOpenSecondForm buttonin eventiin koodi
    SecondForm *sf=new SecondForm(this);
    sf->open();
    
    Edellä SecondFormille annetaan argumenttina this, joka siis viittaa MainWindow luokan olioon. Tämän ansiosta oliota sf ei tarvitse tuhota, vaan se tuhoutuu automaattisesti.
Datan vienti Luokan muodostimeen
  1. Avaa tiedosto secondform.h ja muokkaa luokan muodostin (constructor) muotoon
    explicit SecondForm(QString name, QWidget *parent = nullptr);
    
    Sanan SecondForm päällä Refactor->Apply Function Signature Changes (jolloin muutos tehdään myös cpp-tiedostoon)
    Edellinen siis lisää muodostimeen QString tyyppisen parametrin nimeltään name
  2. Ja lisää sitten secondform.cpp:ssä rivin ui->setupUi(this); perään rivi
    ui->labelInfo->setText(name);
    
  3. Muokkaa mainwindow.cpp:ssä btnOpenSecondForm clicked eventin koodi seuraavaan muotoon
    SecondForm *objectSeconfForm=new SecondForm("Jussi",this);
    objectSeconfForm->open();
    
  4. Suorita sovellus ja testaa, että kun avaat secondformin, näet labelissa nimen Jussi
Edellä siis data vietiin SecondFormiin muodostimen kautta. Tehdään seuraavassa datan vienti ThirdFormiin Set-metodin kautta.
Datan vienti Luokan jäsenmuuttujalle
  1. Lisää thirdform.h:ssa privaatti muuttuja QString setNameFromMain
  2. Lisää em. muuttujalle public-tyyppinen Setter koodilla
    void ThirdForm::setNameFromMain(const QString &newNameFromMain)
    {
        nameFromMain = newNameFromMain;
        ui->labelInfo->setText(nameFromMain);
    }
    
  3. Kirjoita sitten mainwindow.cpp:ssä btnOpenThirdForm clicked eventiin koodi
    ThirdForm *objectThirdForm=new ThirdForm(this);
    objectThirdForm->setNameFromMain("Maija");
    objectThirdForm->show();
    
Datan vienti edelliseen ikkunaan

Jos sinun pitäisi saada uudesta formista saatu data näkymään alkuperäisessä formissa, voit käyttää signal-slot systeemiä tai singleton-luokkaa


kuva1


kuva2


kuva3



Toggle Menu