[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

Qt 4, model-widok

TmP

4/22/2007 9:38:00 PM

Mam klase KlasaZLista, ktora przechowuje liste danych, ktore chce wyswietlic
w QListView. W tym celu tworze sobie model ModelListy, dziedziczacy po
QAbstractListModel. Implementuje w modelu wirualne metody: rowCount i data.
I dzieki temu mam model read only, i w sumie jestem zadowolony.

Problem pojawia sie w momencie, gdy dane w obiekcie typu KlasaZLista sie
zmienia, np, powstanie nowe pole w liscie. Jak sobie poradzic z
uaktualnianiem to co mam w widoku QListView? Nie chodzi mi o to, ze w widoku
dokonuje edycji wyswietlanego wiersza i aktualizuje dane poprzez klase z
modelem, tylko o to, zeby widok sie aktualizowal, gdy dane sie zmienia.

Jakies pomysly jak to zrobic?
TmP


7 Answers

Zbyszek Malec

4/22/2007 10:05:00 PM

0

Dnia Sun, 22 Apr 2007 23:38:26 +0200, TmP napisa3(a):

> Problem pojawia sie w momencie, gdy dane w obiekcie typu KlasaZLista sie
> zmienia, np, powstanie nowe pole w liscie. Jak sobie poradzic z
> uaktualnianiem to co mam w widoku QListView? Nie chodzi mi o to, ze w widoku
> dokonuje edycji wyswietlanego wiersza i aktualizuje dane poprzez klase z
> modelem, tylko o to, zeby widok sie aktualizowal, gdy dane sie zmienia.
>
> Jakies pomysly jak to zrobic?

emit dataChanged() ?

--
Zbyszek Malec Ustronie 104
jid: zbyszanna@chrome.pl

TmP

4/23/2007 12:16:00 AM

0


U¿ytkownik "Zbyszek Malec" <zbyszanna@tlen.pl> napisa³ w wiadomo¶ci
news:1b479iuxclo5g.123w5m9rslp81$.dlg@40tude.net...
> Dnia Sun, 22 Apr 2007 23:38:26 +0200, TmP napisa³(a):
>
>> Problem pojawia sie w momencie, gdy dane w obiekcie typu KlasaZLista sie
>> zmienia, np, powstanie nowe pole w liscie. Jak sobie poradzic z
>> uaktualnianiem to co mam w widoku QListView? Nie chodzi mi o to, ze w
>> widoku
>> dokonuje edycji wyswietlanego wiersza i aktualizuje dane poprzez klase z
>> modelem, tylko o to, zeby widok sie aktualizowal, gdy dane sie zmienia.
>>
>> Jakies pomysly jak to zrobic?
>
> emit dataChanged() ?
>
Dzieki za szybk± odpowiedz.
A mozesz podpowiedziec jescze jakie argumenty QModelIndex & topLeft, const
QModelIndex & bottomRight, przekazac tym signalem? Rozumiem, ze lacze sygnal
dataChanged modelu z slotem dataChanged w widoku?

pozdrawiam
TmP


Zbyszek Malec

4/23/2007 9:45:00 AM

0

Dnia Mon, 23 Apr 2007 02:15:52 +0200, TmP napisa3(a):

> A mozesz podpowiedziec jescze jakie argumenty QModelIndex & topLeft, const
> QModelIndex & bottomRight, przekazac tym signalem? Rozumiem, ze lacze sygnal
> dataChanged modelu z slotem dataChanged w widoku?

Jak ustawisz model dla widoku to on sam sie popodpina. Nie wiem czy dla
listy te parametry maj? sens, spróbuj je olaa i zobaczya co wyjdzie.
Niestety mvc w qt jest przekombinowane. Zreszt? zerknij do dokumentacji,
tam masz sygna3y opisane, jest te? chyba opisana struktura indeksu dla
listy (co jest istotne).

--
Zbyszek Malec Ustronie 104
jid: zbyszanna@chrome.pl

TmP

4/23/2007 5:50:00 PM

0


U¿ytkownik "Zbyszek Malec" <zbyszanna@tlen.pl> napisa³ w wiadomo¶ci
news:brr5gajobj4r$.5b2m4ynlfkzq$.dlg@40tude.net...
> Dnia Mon, 23 Apr 2007 02:15:52 +0200, TmP napisa³(a):
>
>> A mozesz podpowiedziec jescze jakie argumenty QModelIndex & topLeft,
>> const
>> QModelIndex & bottomRight, przekazac tym signalem? Rozumiem, ze lacze
>> sygnal
>> dataChanged modelu z slotem dataChanged w widoku?
>
> Jak ustawisz model dla widoku to on sam siê popodpina. Nie wiem czy dla
> listy te parametry maj± sens, spróbuj je olaæ i zobaczyæ co wyjdzie.
> Niestety mvc w qt jest przekombinowane. Zreszt± zerknij do dokumentacji,
> tam masz sygna³y opisane, jest te¿ chyba opisana struktura indeksu dla
> listy (co jest istotne).

No wydaje mi sie, ze top left, to powinien byc pierwszy (a raczej zerowy)
element w modelu, czyli:
QModelIndex topLeft = this->index (0, 0, QModelIndex ()); //dzieje sie to w
obiekcie ModelListy, czyli na co wskazuje this nie musze chyba mowic

a bottomRight ostatnim indeksem w modelu czyli:
QModelIndex bottomRight = this->index (obiektZDanymi->count (), 0, ???)

Nie za bardzo wiem po co ten ostatni argument...

Wiesz, gdyby mi dokumentacja wszystko wyjasnila, to bym siê nie pytal.
Najwyrazniej albo czegos nie rozumiem, albo cos nie jest dostatecznie
wytlumaczone.

pozdrawiam
TmP



TmP

4/24/2007 12:26:00 AM

0


U¿ytkownik "TmP" <o@o.pl> napisa³ w wiadomo¶ci
news:f0gklr$d1n$1@news.dialog.net.pl...

Polowicznie udalo mi sie rozwiazac problem, ale od poczatku.
W klasie ModelListy : public QAbstractListModel funkcje rowCount () i data
()
zdefiniowalem nastepujaco:
int ModelListy::rowCount (const QModelIndex &parent) const
{
if (parent.isValid ())
return 0;
else
{
return obiektZLista.count ();
}
}

QVariant ModelListy::data (const QModelIndex &index, int role ) const
{
if (!index.isValid())
return QVariant();
if (index.row() >= obiektZLista.count ())
return QVariant();
if (role == Qt::DisplayRole)
return obiektZLista.at (index);
else
return QVariant ();
}

W przypadku gdy zmieni sie obiekt z danymi model listy jest o tym
powiadamiany poprzez wywloanie nastepujacej funkcji:
void ModelListy::Update ()
{
QModelIndex begin;
QModelIndex end;
begin = this->index (0, 0);
end = this->index (obiektZLista.count (), 0);

emit dataChanged (begin, end);
}

I to dziala w momencie gdy w funkcji rowCount zamiast return
obiektZLista.count () wpisze return 15; //na przyklad
Przynajmniej do 15 wierszy w liscie, bo pozniej tradycyjnie juz nie
wyswietla kolejnych wierszy...

O co chodzi? Moze mi ktos wyjasnic czemu tak sie dzieje?

hilfe...help...pomocy...
TmP


Zbyszek Malec

4/24/2007 10:03:00 AM

0

Dnia Tue, 24 Apr 2007 02:26:12 +0200, TmP napisa3(a):

> I to dziala w momencie gdy w funkcji rowCount zamiast return
> obiektZLista.count () wpisze return 15; //na przyklad
> Przynajmniej do 15 wierszy w liscie, bo pozniej tradycyjnie juz nie
> wyswietla kolejnych wierszy...

dataChanged (jak czytamy w dokumentacji), powiadamia widok ?e pod danym
adresem zmieni3y sie dane. W tej sytuacji wiec sie nie nada (tak wiec mój
b3?d). Musisz zastosowaa inny sygna3 (rowInserted zapewne). W ka?dym razie
przedtem zajrzyj do dokumentacji QAbstractItemModel, bo nie mo?na sobie od
tak wyemitowaa tego sygna3u, trzeba wykonaa odpowiednie kroki.
Przy czym tego wszystkiego ja sie dowiedzia3em z dokumentacji, wiec chyba
da rade.

--
Zbyszek Malec Ustronie 104
jid: zbyszanna@chrome.pl

pioky

4/25/2007 10:29:00 PM

0

TmP napisa3(a):
> U?ytkownik "TmP" <o@o.pl> napisa3 w wiadomo?ci
> news:f0gklr$d1n$1@news.dialog.net.pl...
>
> Polowicznie udalo mi sie rozwiazac problem, ale od poczatku.
> W klasie ModelListy : public QAbstractListModel funkcje rowCount () i data
> ()
> zdefiniowalem nastepujaco:
> int ModelListy::rowCount (const QModelIndex &parent) const
> {
> if (parent.isValid ())
> return 0;
> else
> {
> return obiektZLista.count ();
> }
> }
>
> QVariant ModelListy::data (const QModelIndex &index, int role ) const
> {
> if (!index.isValid())
> return QVariant();
> if (index.row() >= obiektZLista.count ())
> return QVariant();
> if (role == Qt::DisplayRole)
> return obiektZLista.at (index);
> else
> return QVariant ();
> }
>
> W przypadku gdy zmieni sie obiekt z danymi model listy jest o tym
> powiadamiany poprzez wywloanie nastepujacej funkcji:
> void ModelListy::Update ()
> {
> QModelIndex begin;
> QModelIndex end;
> begin = this->index (0, 0);
> end = this->index (obiektZLista.count (), 0);
>
> emit dataChanged (begin, end);
> }
>
> I to dziala w momencie gdy w funkcji rowCount zamiast return
> obiektZLista.count () wpisze return 15; //na przyklad
> Przynajmniej do 15 wierszy w liscie, bo pozniej tradycyjnie juz nie
> wyswietla kolejnych wierszy...
>
> O co chodzi? Moze mi ktos wyjasnic czemu tak sie dzieje?
>
> hilfe...help...pomocy...
> TmP
>
>
Wnioskuje ?e najpierw podpinasz model do widoku a potem dopiero
wypelniasz liste danymi

mo?esz tak


void ModelListy::zmienWszystko( const QList<obiekt> & lista )
{
obiektZLista = lista;
reset();
}

albo gdy dodajesz ( lub analogicznie odejmujesz )
void ModelListy::dodaj( obiekt )
{
int row = obiektZLista.size();

beginInsertRows(QModelIndex(), row, row);
obiektZLista.append( obiekt );
endInsertRows();
}

a w przypadku gdy auktualniasz dane w liscie
to dobrze robisz z dataChanged

pozdrawiam
piotr