Graafisen käyttöliittymän ohjelmointi Syksy 2013

Samankaltaiset tiedostot
QT model view. Juha Järvensivu 2008

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Tiedostonkäsittely ja asetusten tallentaminen. Graafisen käyttöliittymän ohjelmointi Luento 14

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Graafisen käyttöliittymän ohjelmointi

Ohjelmoinnin jatkokurssi, kurssikoe

QT tyylit. Juha Järvensivu 2008

Voit käyttää tekemääsi ohjelmaa seuraavan viikon harjoituksissa, joten kopio työsi hedelmät talteen äläkä tuhoa niitä.

QT framework. Juha Järvensivu 2007

Qt perusteet. Juha-Matti Vanhatupa. (vanhan kurssin Graafisen käyttöliittymän ohjelmointi materiaalia)

Suunnittelumalleja, MVC. Juha Järvensivu 2008

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Java UI-komponentit (JTable) Juha Järvensivu 2007

Sisältö. 22. Taulukot. Yleistä. Yleistä

Olio-ohjelmointi Syntaksikokoelma

TIETORAKENTEET JA ALGORITMIT

13 Operaattoreiden ylimäärittelyjä

3. Binääripuu, Java-toteutus

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

15. Ohjelmoinnin tekniikkaa 15.1

Rajapinta (interface)

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Delegaatit ja tapahtumakäsittelijät

Ohjelmistotuotanto. Luento

ITKP102 Ohjelmointi 1 (6 op)

15. Ohjelmoinnin tekniikkaa 15.1

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

T Henkilökohtainen harjoitus: FASTAXON

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Sisältö. 2. Taulukot. Yleistä. Yleistä

18. Abstraktit tietotyypit 18.1

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

1. Olio-ohjelmointi 1.1

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Graafisen käyttöliittymän ohjelmointi

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Taulukot. Jukka Harju, Jukka Juslin

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

UML ja luokkien väliset suhteet

Listarakenne (ArrayList-luokka)

Ohjelmointi 1 Taulukot ja merkkijonot

Loppukurssin järjestelyt

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Metodien tekeminen Javalla

Loppukurssin järjestelyt C:n edistyneet piirteet

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

TIE Ohjelmistojen suunnittelu

Olio-ohjelmointi Javalla

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

ITKP102 Ohjelmointi 1 (6 op)

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Java layoutit. Juha Järvensivu 2007

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

SYÖTTÖPOHJA LUKUJEN SYÖTTÖÖN ERI TARKOITUKSIIN

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

1. Mitä tehdään ensiksi?

16. Javan omat luokat 16.1

4. Olio-ohjelmoinista lyhyesti 4.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Tietorakenteet, laskuharjoitus 7,

4. Luokan testaus ja käyttö olion kautta 4.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Rakenteiset tietotyypit Moniulotteiset taulukot

Ohjelmoinnin peruskurssien laaja oppimäärä

Java kahdessa tunnissa. Jyry Suvilehto

TIE Ohjelmistojen suunnittelu

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Tietueet. Tietueiden määrittely

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

1. Omat operaatiot 1.1

C# ja.net. Juha Järvensivu 2007

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

12 Mallit (Templates)

Muuttujien määrittely

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Ohjelmointi 2 / 2010 Välikoe / 26.3

Eclipse ja JUnit-ohjelmoijatestit

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

Osa VII. Mitä mallit ovat ja kuinka niitä käytetään Miksi mallit tarjoavat paremman vaihtoehdon makroille Kuinka luokkamalleja luodaan

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Ohjelmistotekniikan menetelmät, koe

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

1 Tehtävän kuvaus ja analysointi

Ohjelmoinnin perusteet Y Python

2. Olio-ohjelmoinista lyhyesti 2.1

Transkriptio:

TIE-11300 Tietotekniikan vaihtuva-alainen kurssi Graafisen käyttöliittymän ohjelmointi Syksy 2013 Luento 9 Qt model/view Juha-Matti Vanhatupa

Sisältö Qt:n MV mallin osat Mallin ja näkymän välinen kommunikointi Osien rajapinnat Standard item model Valintamalli (selection model) Datan suodatus (Proxy model)

Yleistä Perinteisestä MVC-mallista poiketen Qt:n model/view:ssä ei ole kontrolleria. Lisäksi käytössä on delegaatit.

Malli Käyttäytyy samoin kuin MVC:n malli Tarjoaa rajapinnan datan käsittelyyn. Joko säilöö sovelluksen datan itse tai kommunikoi varsinaisen säilytyspaikan (esim. tietokannan) kanssa.

Näkymä Toteuttaa yleisen layoutin, navigoinnin item:ien välillä ja datan valinnan. Valmiita näkymäluokkia: esim. ListView ja TableView Yhteen malliin voi liittyä useita eri näkymiä (tarkkailija-suunnittelumalli) Sisältää perinteisen MVC-mallin kontrollerin tehtäviä (tapahtumankäsittely)

Delegaatti Toteuttaa näkymän yksittäisen item:n ulkoasun ja niiden editoinnin Qt tarjoaa oletustoteutukset delegaateille - käytettävä delegaatti voidaan kysyä View luokilta itemdelegate() funktiolla. Oletusdelegaatti riittävä useimmille sovelluksille

Mallin ja näkymän välinen kommunikointi Osat toteuttavat valmiiksi määritellyt rajapinnat QAbstractItemModel QAbstractItemView QAbstractItemDelegate Kommunikointi tapahtuu signaalien avulla Signaalit mallilta informoivat näkymää mallin muutoksista (tarkkailija-suunnittelumalli) Signaalit näkymältä kertovat käyttäjän toimista näytetyille item:eille Signaaleita delegaatilta käytetään kertomaan mallille ja näkymälle editorin tilasta editoinnin aikana

QAbstractItemModel QAbstractItemModel rajapinta ei ota kantaa mallin rakenteeseen.

QAbstractItemModel Standardi rajapinta, jonka kautta näkymät käyttävät mallin dataa Esittää datan hierarkisena taulukkorakenteena Malli tiedottaa näkymää muutoksistaan signalslot mekanismin avulla (tarkkailija-malli).

Mallin ja näkymän välinen kommunikointi Dataan viitataan mallin indeksien avulla QModelIndex Dataa käsitellään variantteina QVariant

QModelIndex Tietorakenne, jolla viitataan mallin dataan - Sisältää pointterin indeksin luoneeseen malliin. Näkymä, delegaatit ja (valintamallit) käsittelevät mallin dataa näiden indeksien avulla (QModelIndex)

QModelIndex QModelIndex luodaan antamalla halutun rivin ja sarakkeen numero mallin index()-funktiolle. Index() -funktion kolmas parametri on parent-indeksi. Malleille joissa vain sarakkeita ja rivejä on parent aina QModelIndex(). QModelIndex:t on tarkoitettu käytettäväksi heti. Ne hajoavat jos mallin rakenne muuttuu. - QPersistentModelIndex QModelIndex indexa = model->index(0, 0, QModelIndex()); QModelIndex indexb = model->index(1, 1, QModelIndex()); QModelIndex indexc = model->index(2, 1, QModelIndex());

QVariant Malli ja näkymä käsittelevät dataa varianttyyppeinä. Qt:n tietotyypit voidaan muuntaa varianttyyppisiksi Myös osa Qt:n tietorakenteista QList, QMap ja QHash voidaan tallentaa varianttiin. Oletusrakentaja generoi Null-variantin QVariant v(123); int x = v.toint();

QVariant Variantti sisältää yleensä yhden arvon (esim int, string), mutta myös multi-variantit ovat mahdollisia QVariantList = QList<QVariant> QVariantList vlist; QVariant v(vlist);

Metatyypin rekisteröinti Myös omia tietotyyppejä voidaan muuttaa variant muotoon, kunhan ne rekisteröidään metaobject-järjestelmään. struct MyStruct { int i;... }; Q_DECLARE_METATYPE(MyStruct) MyStruct s; QVariant var; var.setvalue(s);

Datan lukeminen variantista Perustyypit voidaan muuttaa to-metodeilla (esim v.toint()) Muut tyypit template metodilla int i = var.value<int>(); MyCustomStruct c; if (v.canconvert<mycustomstruct>()) { c = v.value<mycustomstruct>(v); }

Mallin toteutus Käyttötarpeesta riippuen malli voidaan myös toteuttaa seuraavien luokkien avulla: QAbstractListModel (vain rowcount ja data) QAbstractTableModel (rowcount, columncount, data) Tai käyttää kirjaston valmista QStandardItemModel-luokkaa

QAbstractItemView Ylimääriteltävät pure virtual funktiot indexat(const QPoint point) Kertoo mikä itemi on koordinaattien kohdalla scrollto Toteuttaa ikkunan vierityksen QRect visualrect Kertoo itemin vievän tilan ruudulla Valmiit näkymät usein riittäviä QListView QTableView QTreeView

QAbstractItemDelegate Ylimääriteltävät pure virtual funktiot paint Piirtää itemin ruudulle sizehint Palauttaa itemin korkeuden ja leveyden Oletustoteutus QItemDelegate

Standardi-malli QstandardItemModel - Geneerinen malli - Toteuttaa QAbstactItemModel rajapinnan QStandardItem - Item, joita voidaan lisätä standard modeliin

QStandardItem Sisältää variant tyyppistä dataa QVariant QStandardItem::data ( int role = Qt::UserRole + 1 ) const void QStandardItem::setData ( const QVariant & value, int role = Qt::UserRole + 1 ) void QStandardItem::setFlags ( Qt::ItemFlags flags ) Qt::NoItemFlags Qt::ItemIsSelectable Qt::ItemIsEditable Qt::ItemIsDragEnabled Qt::ItemIsDropEnabled Qt::ItemIsUserCheckable Qt::ItemIsEnabled Qt::ItemIsTristate

Role arvo Määrittelee mitä tietoa ollaan hakemassa Qt::ItemDataRole Qt::DisplayRole (näytettävä teksti) Qt::DecorationRole (ikoni) Qt::ToolTipRole (toltipteksti) Qt::StatusTipRole (status palkissa näytettävä teksti) Qt::WhatsThisRole (pikaohje) QVariant data(qmodelindex ind, int role);

Omien role-arvojen määrittäminen #define NAME_ROLE Qt::UserRole+1; #define DIRECTOR_ROLE Qt::UserRole+2; #define PRODUCER_ROLE Qt::UserRole+3; #define WRITER_ROLE Qt::UserRole+4; class CMovie { public: QString name() const; QString director() const; QString producer() const; QString writer() const ; QStringList actorlist() const; }; class CMovieModel { QList<CMovie> m_data; }; modeliin

Omien role-arvojen määrittäminen modeliin QVariant CMovieModel::data(QModelIndex ind, int role) { QVariant result; if(ind.isvalid()) { switch(role) { case Qt::DisplayRole: case NAME_ROLE : result = QVariant( m_data[ind.row()].name() ); break; case WRITER_ROLE : result = QVariant( m_data[ind.row()].writer() ); break; case DIRECTOR_ROLE : result = QVariant( m_data[ind.row()].director() ); break; } } } return result;

QItemSelectionModel Pitää kirjaa valituista item:eistä Liittyy yhteen modeliin, mutta voidaan antaa usealle näkymälle Valmiit näkymäluokat tarjoavat default selectionmodel:n, joka voidaan kysyä selectionmodel() -funktiolla.

QItemSelectionModel Valintamalli voidaan myös asettaa näkymälle kutsumalla setselectionmodel(). Hyödyllinen kun halutaan pitää usean näkymän valitut item:it synkronoituina.

Datan suodatus Suodatuksella voidaan rajata näkymässä esitettävää dataa

Filter Käyttötarkoituksia: Näyttää vain osan mallin datasta käyttäjälle Järjestää datan alkuperäisestä poikkeavaan järjestykseen Toteuttaa saman rajapinnan kuin model (QAbstractItemModel)

QAbstractProxyModel Toteutettava rajapinta: QModelIndex mapfromsource(qmodelindex source) QModelIndex maptosource(qmodelindex source) Peritty QAbstractItemModel kantaluokasta

QSortFilterProxyModel QTreeView *treeview = new QTreeView; MyItemModel *sourcemodel = new MyItemModel(this); QSortFilterProxyModel *proxymodel = new QMySortFilterProxyModel(this); proxymodel->setsourcemodel(sourcemodel); treeview->setmodel(proxymodel);

Omien filterien teko Periyttämällä QSortFilterProxyModel tai QAbstractProxyModel filteracceptsrow() funktio kertoo tuleeko parametrina annettu rivi sisällyttää malliin. - vastaavasti filteracceptscolumn() Oletuksena vertailee item:in Qt:DisplayRole arvoa. lessthan funktio toimii < -operaattorina järjestettäessä item:eitä.