» »

QT4 pomoč

QT4 pomoč

bitlab ::

Upam, da je tu kdo, ki obvlada qt4 in mi bo lahko pomagal (na Qt Centre Forum-u zaenkrat še ni odgovora). Skratka...

Iz pgSql preberem podatke (tabelo) s pomočjo QSqlRelationalTableModel. S setRelation() določim relacijske podatke v tabeli, ki se sklicujejo na druge tabele. Podatke v oknu editiram s pomočjo QDataWidgetMapper. Vse lepo in prav. Podatke lahko editiram, relacije se prikažejo v combo box-ih.

V drugem koraku pa bi želel podatke v modelu filtrirati. V QSqlRelationalTableModel sicer obstaja funkcija setFilter(), ampak mi ponovno prebere podatke iz baze, čemur bi se rad izognil. Druga možnost je uporaba QSortFilterProxyModel, s pomočjo katerega "prefiltriram" podatke iz QSqlRelationalTableModel. Poblem pa nastane pri relacijah, ki ne delujejo več (v tabeli niso več prikazani combo box-i).

Predvidevam, da bi moral narediti svoj ProxyModel oz. nekako predelati QSortFilterProxyModel, da bi podpiral relacije, ampak nimam ideje kako se lotiti tega.

Hvala za pomoč
BiTLAB, informacijska tehnologija, d.o.o.

MasterMind ::

Kakor prebiram dokumentacijo, ugotavljam da je metoda setFilter(pogoj) enako kot WHERE pogoj. Pri čemer je pogoj string v katerem je WHERE blok (atribut1 = "string").

Kako si ga pa ti določil?
Gentoo, KDE uporabnik.

Zgodovina sprememb…

bitlab ::

Kakor prebiram, ugotavljam da je metoda setFilter(pogoj) enako kot EHERE pogoj. Pri čemer je pogoj string v katerem je WHERE blok.

Kako si ga pa ti določil?


To je vse lepo in prav... Ampak, ko uporabiš to metodo, ti model ponovno pošlje query do baze in ponovno prenese podatke v model. Jaz pa bi se rad te komunikacije izognil. In to se da reši s pomočjo proxy modela, samo tu pa pride do problema, ker enotavno ne upošteva relacij.
BiTLAB, informacijska tehnologija, d.o.o.

MasterMind ::

He he. Moj nasvet, raje uporabi tisti filter, imo. Ker filter ti lahko zelo oteži/upočasni zadevo (sem se tudi jaz s tem se malo ukvarjal). No, lahko da sem kaj narobe delal :D.

Pa predidevam, da želiš narediti neko vrsto iskanja, ne? (ker drugače bi lahko setFilter klical pred določanjem tabele in relacije, če prav razumem dokumentacijo).

Če pa želiš delat svoj filter proxy model, moraš pa definirat metodi filterAcceptsColumn in filterAcceptsRow. (ko subclassaš QSortFilterProxyModel)
Gentoo, KDE uporabnik.

Zgodovina sprememb…

bitlab ::

Bom kar na primeru razložil, kje je problem. Gre za aplikacijo za vodenje podjetja (ne računovodstvo, samo vodenje zaloge, izdaja računov, ponudb...)

Večina delov programa uporablja iste podatke iz baze:

    za ponudbo moramo iz baze izbrati stranko in artikle,
    za račun potrebujemo stranko in artikle,
    za prevzem potrebujemo stranko in artikle...

Osnovo UI predstavlja glavno okno, ki prikazuje poljubno mnogo podoken (MDI windows). Torej imamo lahko naenkrat odprtih več ponudb, računov, dobropisov (objekti)... In za vsak tak objekt (večinoma) potrebujemo model artiklov in model kontaktov. Torej če imam odprte štiri objekte, moram za dve tabeli izvršit select query 8x, namesto da bi uporabil modele, ki bi si jih objekti delili in bi v tem primeru select nad bazo delel samo 2x.

In tu pride v poštev proxy model. Vsak objekt, ki ga ustvarim (račun, ponudba...) upravlja samo s proxy modelom, ki se veže na skupne modele. Tako mi ni potrebno ponovno prenašat podatkov iz baze in tudi vse operacije filtriranja, sortiranja se izvajajo na proxy modelu in tako skupni modeli ostanejo nedotaknjeni.

Še ena prednost... Če na drugem računalniku nekdo vnese nov artikel, mi pgSql sproži notify, ki ga program prestreže in osveži model artiklov. Če je odprtih več objektov, ki uporabljajo takšen model, mora podatke prenašat za vsak objekt posebej, če pa se uporablja skupen model, pa podatke prenese samo 1x.
BiTLAB, informacijska tehnologija, d.o.o.

MasterMind ::

Aha. Torej, poskusi subclassat QSortFilterProxyModel in na novo določi tisti dve metodi. Vračata true/false.

Preko parametrov dobiš index (stolpec ali vrstica) ter njegovga očeta. Drugače pa preberi dokumentacijo za več info :).
Gentoo, KDE uporabnik.

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C#] Entity Framework

Oddelek: Programiranje
6909 (740) frudi
»

[Java] Urejanje baze z JTable

Oddelek: Programiranje
8971 (755) vonNeumann
»

DataView, DataTable, DataSet

Oddelek: Programiranje
91113 (864) detroit
»

[C++-Qt] QDateTime v LocalDate in LocalTime formatu

Oddelek: Programiranje
101141 (1033) 'FireSTORM'
»

hierarhija, npr. kategorij

Oddelek: Izdelava spletišč
7890 (850) Zzzzzzz

Več podobnih tem