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.
  6. Testaa sovellusta
  7. 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();
      
    4. Testaa, että sovellus toimii

    kuva1


    kuva2


    kuva3



Toggle Menu