C ++ GUI programmering med Qt4: Layout Management.

Dette kapitlet er fra boken.

Dette kapitlet er fra boken.

Dette kapitlet er fra boken & # xF501;

6. Layout Management.

Legge ut widgets pa et skjema Stacked Layouts Splitters Scrolling Dokumenter Windows og verktoylinjer Multiple Document Interface.

Hver widget som er plassert pa et skjema ma gis en passende storrelse og posisjon. Qt gir flere klasser som legger ut widgets pa et skjema: QHBoxLayout, QVBoxLayout, QGridLayout og QStackedLayout. Disse klassene er sa praktiske og enkle a bruke at nesten hver Qt-utvikler bruker dem, enten direkte i kildekoden eller gjennom Qt Designer.

En annen grunn til a bruke Qts layoutklasser er at de sikrer at skjemaene tilpasses automatisk til forskjellige skrifter, sprak og plattformer. Hvis brukeren endrer systemets skrifttypeinnstillinger, svarer soknadsskjemaene umiddelbart, tilpasser seg om nodvendig. Og hvis du oversetter applikasjonens brukergrensesnitt til andre sprak, tar layoutklassene hensyn til widgets oversatte innhold for a unnga tekstavkorting.

Andre klasser som utforer layoutbehandling inkluderer QSplitter, QScrollArea, QMainWindow og QMdiArea. Alle disse klassene gir et fleksibelt oppsett som brukeren kan manipulere. For eksempel gir QSplitter en splitterlinje som brukeren kan dra for a endre storrelsen pa widgets, og QMdiArea tilbyr stotte for MDI (flere dokumentgrensesnitt), et middel til a vise mange dokumenter samtidig i et programmets hovedvindu. Fordi de ofte brukes som alternativer til riktig utformingsklasser, dekker vi dem i dette kapittelet.

Legge ut widgets pa et skjema.

Det er tre grunnleggende mater a handtere utformingen av barn widgets pa et skjema: absolutt posisjonering, manuell oppsett og layout ledere. Vi vil se pa hver av disse tiln rmingene i sin tur, ved a bruke dialogboksen Finn fil som vist i Figur 6.1 som vart eksempel.

Figur 6.1 Dialogboksen Finn fil.

Absolutt posisjonering er den raeste maten a legge ut widgets pa. Det oppnas ved a tilordne hardkodede storrelser og posisjoner til formens barn widgets og en fast storrelse til skjemaet. Slik ser FindFileDialog-konstruktoren ut som a bruke absolutt posisjonering:

Absolutt posisjonering har mange ulemper:

Brukeren kan ikke endre storrelsen pa vinduet. Enkelte tekst kan bli avkortet hvis brukeren velger en uvanlig stor skrift eller om programmet er oversatt til et annet sprak. Widgetene kan ha upassende storrelser for noen stiler. Stillingene og storrelsene ma beregnes manuelt. Dette er kjedelig og feilaktig, og gjor vedlikehold smertefullt.

Et alternativ til absolutt posisjonering er manuell oppsett. Med manuell oppsett, er widgets fortsatt gitt absolutte stillinger, men deres storrelser er gjort proporsjonal med vinduets storrelse i stedet for a v re helt hardkodede. Dette kan oppnas ved a reimplementere formens resizeEvent () funksjon for a sette sine barn widgets ‘geometrier:

I FindFileDialog-konstruktoren setter vi formens minste storrelse til 265 x 190 og den opprinnelige storrelsen til 365 x 240. I handlingen resizeEvent () gir vi ekstra plass til widgets som vi onsker a vokse. Dette sikrer at skjemaet skaleres jevnt nar brukeren endrer storrelsen pa den.

Akkurat som absolutt posisjonering krever manuell oppsett mange hardkodede konstanter som beregnes av programmereren. Skrivingskoden som dette er kjedelig, spesielt hvis designet endres. Og det er fortsatt risiko for tekstkorting. Vi kan unnga denne risikoen ved a ta hensyn til storrelsen pa barn widgets, men det vil komplisere koden enda mer.

Den mest praktiske losningen for a legge ut widgets pa et skjema er a bruke Qts layoutledere. Layoutadministratorene gir fornuftige standardverdier for hver type widget og tar hensyn til hver widgetens hint, som igjen avhenger vanligvis av widgetens skrift, stil og innhold. Layout-ledere respekterer ogsa minimums- og maksimumstorrelser, og justerer automatisk oppsettet som svar pa skrifttypeendringer, innholdsendringer og storrelsesendring av vinduer. En resizable versjon av dialogboksen Finn fil vises i figur 6.2.

Figur 6.2 Endre storrelse pa en resizable dialog.

De tre viktigste layoutlederne er QHBoxLayout, QVBoxLayout og QGridLayout. Disse klassene er hentet fra QLayout, som gir grunnleggende rammeverk for layout. Alle tre klassene er fullt stottet av Qt Designer og kan ogsa brukes direkte i kode.

Her er FindFileDialog-koden ved hjelp av layoutadministratorer:

Oppsettet handteres av en QHBoxLayout, en QGridLayout og en QVBoxLayout. QGridLayout til venstre og QVBoxLayout til hoyre er plassert side ved side av den ytre QHBoxLayout. Marginen rundt dialogboksen og avstanden mellom barn widgets er satt til standardverdier basert pa gjeldende widget stil; de kan endres ved hjelp av QLayout :: setContentsMargins () og QLayout :: setSpacing ().

Figur 6.3 Finn fildialogens layout.

Den samme dialogen kan opprettes visuelt i Qt Designer ved a plassere barnets widgets i deres omtrentlige stillinger; velge de som trenger a bli lagt ut sammen; og klikk pa Form | Legg ut horisontalt, Skjema | Legg ut vertikalt, eller Skjul | Legg ut i et rutenett. Vi brukte denne tiln rmingen i kapittel 2 for a lage regnearkprogrammets Go to Cell og Sorter-dialoger.

A bruke QHBoxLayout og QVBoxLayout er ganske grei, men a bruke QGridLayout er litt mer involvert. QGridLayout fungerer pa et todimensjonalt rutenett av celler. QLabel i overste venstre hjorne av oppsettet er i posisjon (0, 0), og den tilsvarende QLineEdit er i posisjon (0, 1). QCheckBoxen spenner over to kolonner; det okkuperer cellene i stillinger (2, 0) og (2, 1). QTreeWidget og QLabel under det spenner ogsa over to kolonner. Samtalene til QGridLayout :: addWidget () har folgende syntaks:

Her er widgeten barnetjenesten a sette inn i oppsettet, (rad, kolonne) er den overste venstre cellen okkupert av widgeten, rowSpan er antall rader okkupert av widgeten, og columnSpan er antall kolonner okkupert av widget. Hvis utelatt, argumenterer rowSpan og columnSpan argumenter til 1.

AddStretch () -samtalen forteller den vertikale layoutbehandleren a forbruke plass pa det tidspunktet i oppsettet. Ved a legge til et strekkelement, har vi fortalt layoutsjefen a legge til overflodig mellomrom mellom Lukk-knappen og Hjelp-knappen. I Qt Designer kan vi oppna samme effekt ved a sette inn en spacer. Spacers vises i Qt Designer som bla «fj rer».

Bruke layoutledere gir ekstra fordeler til de vi har diskutert hittil. Hvis vi legger til en widget i et layout eller fjerner en widget fra en layout, tilpasses layoutet automatisk til den nye situasjonen. Det samme gjelder hvis vi kaller skjul () eller show () pa en barn-widget. Hvis et barn widget widgetens hint endres, vil oppsettet automatisk bli omgjort, med tanke pa den nye storrelsen hint. Oppsettbehandlere stiller ogsa automatisk en minimumsstorrelse for skjemaet som helhet, basert pa formens barn widgets minimumstorrelser og storrelsestips.

I eksemplene som er presentert sa langt, har vi ganske enkelt satt widgets til layouter og brukt spacer elementer (strekker) for a forbruke overflodig plass. I noen tilfeller er dette ikke tilstrekkelig til a gjore layoutet akkurat slik vi onsker. I disse situasjonene kan vi justere oppsettet ved a endre storrelsespolitikken og storrelsen pa widgets som legges ut.

En widgets storrelsespolitikk forteller layoutsystemet hvordan det skal strekke seg eller krympe. Qt gir fornuftig standardstorrelsespolicy for alle sine innebygde widgets, men siden ingen enkelt standard kan regne med alle mulige oppsett, er det fremdeles vanlig for utviklere a endre storrelsespolitikken for en eller to widgets pa et skjema. En QSizePolicy har bade en horisontal og en vertikal komponent. Her er de mest nyttige verdiene:

Fast betyr at widgeten ikke kan vokse eller krympe. Widgeten forblir alltid pa storrelse med storrelsestipset. Minimum betyr at widgetens storrelsestips er minimumstorrelsen. Widgeten kan ikke krympe under storrelseshinten, men det kan vokse for a fylle ledig plass om nodvendig. Maksimum betyr at widgetens storrelsestips er maksimal storrelse. Widgeten kan krympes til sin minste storrelse hint. Foretrukket betyr at widgetens storrelseshint er den foretrukne storrelsen, men at widgeten fortsatt kan krympe eller vokse om nodvendig. Utvidelse betyr at widgeten kan krympe eller vokse og at den er spesielt villig til a vokse.

Figur 6.4 oppsummerer betydningen av de ulike storrelsespolicyene, ved hjelp av en QLabel som viser teksten «Some Text» som et eksempel.

Figur 6.4 Betydningen av de ulike storrelsespolicyene.

I figuren er Foretrukket og Utvidelse avbildet pa samme mate. Sa, hva er forskjellen? Nar et skjema som inneholder bade Foretrukne og Utvidende widgets, blir endret, blir det gitt ekstra plass til de utvidende widgets, mens de foretrukne widgets forblir pa deres storrelseshint.

Det er to andre storrelsesregler: MinimumExpanding and Ignored. Den tidligere var nodvendig i noen fa sjeldne tilfeller i eldre versjoner av Qt, men det er ikke nyttig lenger; Den foretrukne tiln rmingen er a bruke Utvidelse og reimplementering av minimumSizeHint () pa riktig mate. Sistnevnte ligner pa Utvidelse, bortsett fra at den ignorerer widgetens storrelseshint og minimumstorrelseshint.

I tillegg til storrelsespolitikkens horisontale og vertikale komponenter lagrer QSizePolicy-klassen en horisontal og en vertikal strekkfaktor. Disse strekkfaktorene kan brukes til a indikere at ulike barn widgets skal vokse til forskjellige priser nar skjemaet utvides. Hvis vi for eksempel har en QTreeWidget over QTextEdit, og vi vil at QTextEdit skal v re dobbelt sa hoy som QTreeWidget, kan vi sette QTextEdits vertikale strekkfaktor til 2 og QTreeWidget’s vertikale strekkfaktor til 1.

Enda en annen mate a pavirke et layout pa er a angi en minimumsstorrelse, en maksimal storrelse eller en fast storrelse pa barnets widgets. Oppsettlederen vil respektere disse begrensningene nar du legger ut widgets. Og hvis dette ikke er tilstrekkelig, kan vi alltid avlede fra barnets widgetens klasse og reimplement sizeHint () for a fa tak i storrelsestipset vi trenger.


Hei! Vil du spille i det mest populære kasinoet? Vi forbereder det for deg. Prøv her nå!