PySide / PyQT oppl ring: QListView og QStandardItemModel.

I var siste rate diskuterte vi Qt’s QListWidget-klassen, som gjor at brukeren kan lage enkle listekasser med en kolonne. For mer avanserte listekontroller er det imidlertid nodvendig med en mer fleksibel widget; Qt leverer derfor QListView-modulen, som gjor at flere varierte elementer kan opprettes. Det er en ren presentasjons widget, som viser informasjon levert av en datamodell. Dette skiller logikken til dataene som presenteres fra widgeten som gjor presentasjonen; Det finnes flere widgets som kan vise data fra samme modellstrukturer.

Det er noen spesialiserte typer modeller som allerede er opprettet for deg. For eksempel gir QStandardItemModel begrensede muligheter som er noe storre enn de vi sa i siste avdrags diskusjon av QListWidget; I tillegg til tekst og ikoner gir det dra og slipp-muligheter, kontrollerbare elementer og andre funksjoner. Tilpasset oppforsel kan implementeres ved a arve fra QAbstractListModel, en generell modell for listedata.

PySide / PyQt er QStandardItemModel.

Vi begynner med a diskutere bruk av en QListView med en QStandardItemModel. QListView er instantiated akkurat som alle andre QWidget – blir du kjedelig med den linjen for hver widget vi moter? Det gjor kjedelig lesing, men en lett husket objektmodell; en av PyQt / Pysides storste styrker er dens enkelhet, memorabilitet og konsistens. Pa den annen side tar QListViews konstruktor en valgfri forelder:

Lett nok. Na trenger listen var en modell for a administrere dataene sine. Vi lager en QStandardItemModel med var liste som sin (valgfri) forelder:

Det finnes andre konstruktor signaturer for QStandardItemModel, men de er ikke relevante for var enkeltkolonniste; vi skal diskutere dem en gang til.

PySide / PyQt er QStandardItem.

A lage listen og modellen er den enkle delen; Hovedarbeidet i listen kommer i a skape og fylle modellen. For eksempel, la oss lage et element for var liste:

Vi kan sette sin tekst og ikon pa praktiske mater:

Vi kunne ogsa ha opprettet vart element med sin tekst (og ikon, hvis onskelig) allerede satt:

Vi kan ogsa gjore et element kontrollerbart, som legger til en avmerkingsboks i venstre side av elementet:

Hvis du vil at boksene dine skal ha tre stater – merket, ikke merket og null – bruk item.setTristate (bool).

Et kort QStandardItem eksempel.

Det er nok bakgrunn som vi kan gi et enkelt eksempel pa utseendet til en QListView, men det vil ikke gjore noe enda. Vi vil forenkle sa mye som mulig ved a gjore hovedvinduet til en QListView; Vi vil gjore det samme grunnleggende oppsettet som et hvilket som helst QWidget -as-a-window eksempel:

Deretter lager vi var modell:

Deretter skal vi opprette noen QStandardItem s for a fylle modellen. Som en hyllest til min kone – vi forventer en tredje baby denne sommeren – jeg skal gjore den til en liste over matvarer hun har savnet sa langt. Hver vil ha en teksttekst og en avkrysningsboks:

Til slutt bruker vi var modell til QListView, viser vinduet og kjorer appen:

Det komplette eksemplet, med forklaringene trimmet og relegated til kommentarer, er:

Nar det kjores, ser det slik ut:

Legge til enkel funksjonalitet.

Det er alt bra og bra, men det gjor ikke noe enda. La oss se pa hvordan du lager en QListView med en QStandardItemModel svar pa brukerinteraksjon.

Du kan tenke deg at hver QStandardItem ville v re som en QPushButton og ville sende ut signaler nar den er valgt, sjekket, redigert og sa videre – i det minste, hvis du er som meg, det er det du forventer. I sa fall ville du, som jeg, v re feil. Det er effektivt et signal som angir hva som har skjedd med elementer i en QStandardItemModel, og det er itemChanged (item). Som du kan se, b rer den til sporet elementet som er endret, og for a fortelle hva som har skjedd med det, ma du inspisere varen. Jeg finner dette mindre enn ideelt, men det er det vi far.

Du kan inspisere elementer som ikke er endret ved a bruke modellens metoden metode; som returnerer varen til en spesifisert nullbasert rad. (Det kan ogsa akseptere en kolonne for flere kolonnemodeller, som vi kan se en annen gang.)

Det er ogsa et stort antall signaler som indikerer endringer i modellens struktur; Disse er alle arvet fra QAbstractItemModel og kan inspiseres her. Vi snakker mer om dem i en senere diskusjon av QAbstractItemModel, som er et annet emne i sin helhet; For vart nav rende eksempel trenger vi ikke noen av dem.

La oss lage var liste i en honning-do liste; du sjekker ut varer mens du kjoper og / eller forbereder dem, og nar du er ferdig, lukkes vinduet. (Jeg vet, dette er et sv rt kunstig og konstruert eksempel.)

Forst endrer vi tittelen:

Deretter trenger vi et spor for a koble til modellens elementBelagt signal. Vi vil forst sjekke om det endrede elementet er merket med sin CheckState-metode, for a unnga a ga gjennom alle elementene hver gang. Hvis det er sjekket, ser vi om de andre er sjekket. hvis de alle er, vil vi fa QApplication slutte:

Deretter hekker vi elementetBelagt signal opp til sporet var:

Det er alt vi trenger a gjore. Her er den fulle koden for vart modifiserte eksempel:

Det er en enkel applikasjon av en QListView. Det kan gjore mye mer, men den samme modellen kan brukes til andre widgets, og vi ser pa flere av dens evner en gang til. Neste gang skal vi se pa noe helt annet, en av kontrollene som spenner meg mest i Qt: QWebView, en WebKit basert kontroll for a gjengi HTML / CSS / XML / XSLT sider.