QT model view. Juha Järvensivu 2008

Samankaltaiset tiedostot
Graafisen käyttöliittymän ohjelmointi Syksy 2013

Graafisen käyttöliittymän ohjelmointi Syksy 2013

QT tyylit. Juha Järvensivu 2008

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

Olio-ohjelmointi Syntaksikokoelma

QT framework. Juha Järvensivu 2007

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Leikepöydän käyttö.net ja QT. Juha Järvensivu 2008

15. Ohjelmoinnin tekniikkaa 15.1

TIETORAKENTEET JA ALGORITMIT

Suunnittelumalleja, MVC. Juha Järvensivu 2008

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

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Rajapinta (interface)

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

2. Olio-ohjelmoinista lyhyesti 2.1

18. Abstraktit tietotyypit 18.1

Metodien tekeminen Javalla

Listarakenne (ArrayList-luokka)

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

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

UML ja luokkien väliset suhteet

Graafisen käyttöliittymän ohjelmointi Syksy 2013

3. Binääripuu, Java-toteutus

C# ja.net. Juha Järvensivu 2007

Taulukoiden käsittely Javalla

Muuttujien roolit Kiintoarvo cin >> r;

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Graafisen käyttöliittymän ohjelmointi

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Java kahdessa tunnissa. Jyry Suvilehto

4. Olio-ohjelmoinista lyhyesti 4.1

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

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

15. Ohjelmoinnin tekniikkaa 15.1

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

Mikä yhteyssuhde on?

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

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

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

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

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

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

12 Mallit (Templates)

Olio-ohjelmointi Javalla

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

1. Mitä tehdään ensiksi?

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

1. Olio-ohjelmointi 1.1

Ohjelmoinnin jatkokurssi, kurssikoe

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

Rakenteiset tietotyypit Moniulotteiset taulukot

Graafisen käyttöliittymän ohjelmointi

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Java layoutit. Juha Järvensivu 2007

Tietorakenteet ja algoritmit

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

Lista luokan sisällä

Windowsin sanomanvälitys. Juha Järvensivu 2007

Taulukot. Jukka Harju, Jukka Juslin

C++11 lambdat: [](){} Matti Rintala

Loppukurssin järjestelyt

17. Javan omat luokat 17.1

Olio-ohjelmointi 2. välikoe HYV5SN

Tietorakenteet ja algoritmit

Loppukurssin järjestelyt C:n edistyneet piirteet

13 Operaattoreiden ylimäärittelyjä

Delegaatit ja tapahtumakäsittelijät

Ohjelmointi 1 Taulukot ja merkkijonot

16. Javan omat luokat 16.1

Attribuutit. Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty.

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

YHTEYSSUHDE (assosiation)

Tietorakenteet ja algoritmit

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

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

Luokan muodostimet (Constructors)

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

T Henkilökohtainen harjoitus: FASTAXON

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

TIE Ohjelmistojen suunnittelu

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Tech Conference Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI

Sarjallistaminen. Juha Järvensivu 2007

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

Moduli 2: Osoittimet ja taulukot. Joel Huttunen

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Ohjelmistotuotanto, kurssikoe , H. Laine Arvostelu

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

Tietorakenteet, laskuharjoitus 7,

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

1 Tehtävän kuvaus ja analysointi

Käyttöliittymän lokalisointi. Juha Järvensivu 2008

Transkriptio:

QT model view Juha Järvensivu juha.jarvensivu@tut.fi 2008

Johdanto Model, View ja Delegaatit kommunikoivat singaaleista koostuvien rajapintojen avulla Malli informoi data muutoksista View informoi käyttäjän toimista (esim datan valinta) Delegaatti informoi edit statuksesta

Geneeriset tietotyypit QModelIndex Indeksi jonka avulla näkymä kysyy dataa mallilta (malli luo käytettävät indeksit) QVariant Malli ja näkymä käsittelevät dataa variant tyyppeinä

Model index Tietorakenne, jolla viitataan dataan Sisältää pointterin modeliin, joka indeksin on luonut Temporary references Näkymä ja delegaatit käsittelevät modelin dataa indeksien avulla (QModelIndex) QModelIndex indexa = model->index(0, 0, QModelIndex()); QModelIndex indexb = model->index(1, 1, QModelIndex()); QModelIndex indexc = model->index(2, 1, QModelIndex());

Persistent model index QPersistentModelIndex Käytetään QModelIndexin tilalta, jos tarvetta säilöä indeksiä pitkäksi aikaa

QVariant Model ja view käsittelevät dataa varianttyyppeinä QT:n data tyypit voidaan muuntaa varianttyyppisiksi Oletusrakentaja generoi Null-variantin QVariant v(123); int x = v.toint();

QVariant Variantti sisältää yleensä yhden arvon (esim int, string), mutta myös multivariantit 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-metodilla (esim v.toint()) Muut tyypit template metodilla int i = var.value<int>(); MyCustomStruct c; if (v.canconvert<mycustomstruct>()) { c = v.value<mycustomstruct>(v); }

QAbstractItemModel

QAbstractItemModel Standardi rajapinta, jonka kautta näkyvät käyttävät mallin dataa Esittää datan hierarkisena taulukkorakenteena Malli informoi näkymää muutoksista signal-slot mekanismin avulla QModelIndex index = model->index(row, column,...);

Read only model Toteutettava rajapinta: QModelIndex index(int r, int c, QModelIndex parent); QModelIndex parent(qmodelindex ind); Int rowcount(); Int columncount(); QVariant data(qmodelindex ind);

Editable model Toteutettava lisäksi: bool setdata(qmodelindex ind, QVariant data, int role) ItemFlags Flags(QModelIndex ind) Lisäksi tapahtuneista muutoksista tulee informoida näkymiä signaaleilla emit datachanged(qmodelindex topleft, QModelIndex bottomright)

Resizable model Toteutettava lisäksi: insertrows(int row, int count, QModelIndex parent) insertcolumns(int column, int count, QModelIndex parent) removerows(int row, int count, QModelIndex parent) removecolumns(int column, int count, QModelIndex parent)

insertrows - toteutus Ennen datan lisäämistä tulee kutsua: begininsertrows(qmodelindex parent, int first, int last) Lisäyksen jälkeen tulee kutsua: endinsertrows()

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

Yleistä Näkymä Toteuttaa yleisen layoutin, navigoinnin itemien välillä ja datan valinnan Delegaatti Toteuttaa yksittäisen itemin ulkoasun

QAbstractItemView Toteutettava rajapinta: QRect visualrect(qmodelindex ind); QRegion visualregionforselection(qitemselection s); Int horizontaloffset(); QModelIndex indexat(qpoint p); Bool isindexhidden(qmodelindex ind); scrollto() setselection() verticaloffset()

Delegaatti QAbstactItemView* pview; QAbstractItemDelegate pdelegate; pview->setitemdelegate(pdelegate, icolumn);

QAbstractItemDelegate Toteutettava rajapinta: void paint(qpainter p, QStyleOptionViewItem option, QModelIndex ind) QSize sizehint(qstyleoptionviewitem option, QModelIndex ind)

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 modeliin #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; };

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 itemeistä Liittyy yhteen modeliin, mutta voidaan antaa usealle näkymälle

QItemSelectionModel QAbstactItemModel* pmodel; QItemSelectionModel* selectionmodel(pmodel); QAbstractItemView* pview1; pview1->setmodel(pmodel); pview1->setselectionmodel(pmodel); QAbstractItemView* pview2; pview2->setmodel(pmodel); pview2->setselectionmodel(pmodel);

Filter

Filtterit 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 QSortFilterProxyModel(this); proxymodel->setsourcemodel(sourcemodel); treeview->setmodel(proxymodel);

QSortFilterProxyModel void setfilter(qstring writer) { m_writer = writer;} bool MySortFilterProxyModel::filterAcceptsRow(int sourcerow, const QModelIndex &sourceparent) const { QModelIndex ind = sourcemodel()->index(sourcerow, 0, sourceparent); QString s = sourcemodel()->data(ind,writer_role).tostring(); } return (s == m_writer);

Lähteet Throlltech http://trolltech.com/products/qt QT Model-View programming http://doc.trolltech.com/4.3/model-viewprogramming.html