QListView, różne odstępy pomiędzy elementami w liście

0

Cześć!

Projektuje program, w którym mam wydarzenia. Chcę przedstawić te wydarzenia w formie listy, używam aktualnie QListView. Najbardziej istotne są dla mnie QItemDelegate (żebym mógł pokazać customowy item), oraz to że wspiera Model. Że mogę sobie operować na modelu, a QT wyświetla itemy.

Teraz chcę zrobić coś takiego, żeby różne itemy mogły mieć różne odstępy pomiędzy sobą. Udało mi się ustawić różne rozmiary eventów. Wydarzenie które trwa dłużej, ustawiłem mu sizeHint() w QItemDelegate, i teraz eventy które trwają dłużej, są wysokie, a eventy które trwają krócej są niższe.

Teraz chciałbym w podobny sposób reprezentować odstępy pomiędzy nimi. Czasem eventy są zaraz po sobie (i wtedy chciałbym pokazać bardzo mały, mniejszy niż 10px), a czasem wydarzenia są dalej od siebie. Wtedy chciałbym je pokazać dalej od siebie - z większym odstępem.

Znalazłem na razie tylko spacing(int), ale to sprawia że odstępy są zawsze takie same.

Jakiś pomysł?

1

Nie wiem czy dobrze rozumiem ideę ale czy próbowałeś QSpacerItem ?

0

Daj w sizeHint() razem z wyliczonym odstępem przed (lub po) jedynie narysuj tą część która przed (lub po) kolorem tła listy.

0
zkubinski napisał(a):

Nie wiem czy dobrze rozumiem ideę ale czy próbowałeś QSpacerItem ?

Próbuję zrobić coś takiego:

example.gif

0
_13th_Dragon napisał(a):

Daj w sizeHint() razem z wyliczonym odstępem przed (lub po) jedynie narysuj tą część która przed (lub po) kolorem tła listy.

Wtedy odstęp się podświetla i zaznacza. Sprawia to wrażenie po prostu bardzo długiego eventa, a ja potrzebuję odstępu między nimi.

0

W takim razie zrób przerwy osobnymi item'ami zaś ustaw ich jako disabled.

0
_13th_Dragon napisał(a):

W takim razie zrób przerwy osobnymi item'ami zaś ustaw ich jako disabled.

Jak ustawić item jako disabled, jeśli używam QStyledItemDelegate?

Ale wtedy musiałbym dodawać wartości do modelu, po to żeby nimi "symulować" odstęp. Dziwne.

0

zobacz, może to podrzuci ci jakieś rozwiązanie

  1. StackOverflow1
  2. StackOverflow2
0
zkubinski napisał(a):

zobacz, może to podrzuci ci jakieś rozwiązanie

  1. StackOverflow1
  2. StackOverflow2

Pierwszy widziałem, nie ma tam nic co działa.
Drugie to pytanie i 0 odpowiedzi.

0

no to jeszcze jakaś garść czegoś co potencjalnie może się nadawać

QSize MyDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
   return(QSize(100, 50));
}

link1 tyle że w Pythonie, może coś wpadnie ci w oko

link2

0
zkubinski napisał(a):

no to jeszcze jakaś garść czegoś co potencjalnie może się nadawać

QSize MyDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
   return(QSize(100, 50));
}

Nie widziałeś jak napisałem to?

Riddle napisał(a):
_13th_Dragon napisał(a):

Daj w sizeHint() razem z wyliczonym odstępem przed (lub po) jedynie narysuj tą część która przed (lub po) kolorem tła listy.

Wtedy odstęp się podświetla i zaznacza. Sprawia to wrażenie po prostu bardzo długiego eventa, a ja potrzebuję odstępu między nimi.

1
Riddle napisał(a):
_13th_Dragon napisał(a):

W takim razie zrób przerwy osobnymi item'ami zaś ustaw ich jako disabled.

Jak ustawić item jako disabled, jeśli używam QStyledItemDelegate?

Ale wtedy musiałbym dodawać wartości do modelu, po to żeby nimi "symulować" odstęp. Dziwne.

Niekoniecznie.
Możesz zrobić "zwykły" model z surowymi danymi oraz napisać jakiś proxy model, który podepniesz pod widok.
Takie proxy po prostu w zależności od tego czy index.row() jest parzyste czy nie zwracałoby albo dane z 'prawdziwego' modelu(czyli te wydarzenia) albo je imitowało(czyli obliczałoby rozmiar pustaka + czyściłoby flagę Qt::ItemIsEnabled).

0
tajny_agent napisał(a):
Riddle napisał(a):
_13th_Dragon napisał(a):

W takim razie zrób przerwy osobnymi item'ami zaś ustaw ich jako disabled.

Jak ustawić item jako disabled, jeśli używam QStyledItemDelegate?

Ale wtedy musiałbym dodawać wartości do modelu, po to żeby nimi "symulować" odstęp. Dziwne.

Niekoniecznie.
Możesz zrobić "zwykły" model z surowymi danymi oraz napisać jakiś proxy model, który podepniesz pod widok.
Takie proxy po prostu w zależności od tego czy index.row() jest parzyste czy nie zwracałoby albo dane z 'prawdziwego' modelu(czyli te wydarzenia) albo je imitowało(czyli obliczałoby rozmiar pustaka + czyściłoby flagę Qt::ItemIsEnabled).

A jak bym wtedy zrobił dodawanie, usuwanie i zmianę wartości?

1

Nie wiem, pytałeś o wyświetlanie :P

Ale wydaje mi się, że QAbstractProxyModel to dobry kierunek.

0
tajny_agent napisał(a):

Nie wiem, pytałeś o wyświetlanie :P

Ale wydaje mi się, że QAbstractProxyModel to dobry kierunek.

Po co byłby mi model, gdybym chciał tylko wyświetlać ;D

Nie, potrzebuje normalnie robić inserty, remove'y, etc. Możę filtrowanie. Nie potrzebuje tylko sortowania.

0
Riddle napisał(a):
tajny_agent napisał(a):

Nie wiem, pytałeś o wyświetlanie :P

Ale wydaje mi się, że QAbstractProxyModel to dobry kierunek.

Po co byłby mi model, gdybym chciał tylko wyświetlać ;D

Nie, potrzebuje normalnie robić inserty, remove'y, etc. Możę filtrowanie. Nie potrzebuje tylko sortowania.

Jestem nowy w QT, piszę od kilku dni. pokazałbyś jakiś przykład?

Może tak w ogóle być, że proxy może sobie "wytworzyć" nowy element?

0

Chyba podpiąłem implementację, najpierw pod QIdentityProxyModel, ale teraz żaden element się nie pokazuje :/

0
_13th_Dragon napisał(a):

Szklana kula wskazuje ...

No jak przekazuję mój model do QListView to wszystko śmia, ale jak tylko opakuję go w QIdentityProxyModel, to nie widzę zadnych elementów w list-view.

1

Bracie @Riddle takie akrobacje będą zapewne wymagały zaimplementowania własnego QAbstractItemView, może przy odrobinie szczęścia da się oprzeć na QListView aby napisać własną metodę paintEvent()z własnymi, zmiennymi odstępami. Poszukaj w dokumentacji QStyleOptionod QListView/QAbstractItemView, któryś z nich zawiera definicję odstępu pomiędzy elementami - tylko w takim wypadku nie będzie on zmienny.

0

Właśnie miałem pisać, że tak po przemyśleniu na świeżo to QAbstractItemView byłby chyba najodpowiedniejszy.

Sprawdziłem poprzedni pomysł z modelem proxy no i niby działa, ale mimo wyzerowania wszystkich flag dla 'odstępów' one i tak reagują na hover.

Model bazowy: QStringListModel
po lewej QListView + QStringListModel, po prawej QListView + Proxy
listview.png

1

Jeszcze inna opcja Bracie @Riddle to zlać kompletnie item-view framework, te twoje Dinner, Breakfast i Supper to de facto tylko tekst który zrobisz najprostszym QLabelem. Owe labele trzymałbyś na jakimś rodzicielskim QWidgetcie z layoutem wertykalnym, natomiast odstęp między nimi załatwiłbyś poprzez fixed QSpacerItemy.

0

Czy można wiedzieć czemu mają służyć te odstępy ? Jaką korzyść ma to przynieść ?

0
zkubinski napisał(a):

Czy można wiedzieć czemu mają służyć te odstępy ? Jaką korzyść ma to przynieść ?

Jeśli odpiszę, a Ty masz plan powiedzieć: "to w takim razie nie rób tego", to dziekuję bardzo.

Mają sugerować odległość wydarzeń między soba. Wydarzenia oddzielone bardziej od siebie powinny mieć większy odstęp.

0

rozumiem, że te odległości od "zdarzeń" mają w miarę upływu czasu się zwężać i im bliżej określonego zdarzenia, tym odległość mniejsza.

Jeżeli dobrze rozumiem, to moja propozycja jest taka - zamiast kombinować z odległościami, to czy nie łatwiej byłoby dla każdego zdarzenia ustawić ukryty licznik czasu (może być też widoczny) i np na 10-15 minut przed wystąpieniem określonego zdarzenia byłby emitowany sygnał dźwiękowy, zdarzenie by się podświetlało na jakiś kolor i obok zdarzenia wyskakiwałby ruszający się dzwoneczek ?

możesz też jeszcze zrobić tak, że dane zdarzenie które jeszcze nie wystąpiło jest ukryte albo wyszarzone i im bliżej zdarzenia, tym kolor robi się intensywniejszy

0
zkubinski napisał(a):

rozumiem, że te odległości od "zdarzeń" mają w miarę upływu czasu się zwężać i im bliżej określonego zdarzenia, tym odległość mniejsza.

Jeżeli dobrze rozumiem, to moja propozycja jest taka - zamiast kombinować z odległościami, to czy nie łatwiej byłoby dla każdego zdarzenia ustawić ukryty licznik czasu (może być też widoczny) i np na 10-15 minut przed wystąpieniem określonego zdarzenia byłby emitowany sygnał dźwiękowy, zdarzenie by się podświetlało na jakiś kolor i obok zdarzenia wyskakiwałby ruszający się dzwoneczek ?

Dziękuję za tak "mądre" rozwiązanie, ale to coś zupełnie nie pasuje do mojej aplikacji. Co do samego pomysłu nie, bo wydarzenia w tej aplikacji nie są "teraz". To mogą być wydarzenia np sprzed roku, albo za rok. Nie mają żadnego związku z "teraźniejszością". Chodzi po prostu o czyjąś rutunę dnia, nie mają powiadamianić niczego o niczym. To po prostu jest lista rzeczy która się stała (albo ma stać w przyszłości, nie ma żadnego związku z tym jaka jest "Teraz godzina"). Wydarzenia mają długość, nie nachodzą na siebie, i mają od siebie różne odległości. Pisałem to już, dłuższe wydarzenia mają być większe, krótsze mają być mniejsze. Wydarzenie które trwa 24h powinno mieć wysokość 100% i żadnego odstępu.

Prosiłem Cię w poście wyżej tak? Jeśli odpiszę, a Ty masz plan powiedzieć: "to w takim razie nie rób tego", to dziekuję bardzo.

UI aplikacji jest taki, że ma być odstęp pomiędzy elementami w liście. Koniec kropka.

zkubinski napisał(a):

możesz też jeszcze zrobić tak, że dane zdarzenie które jeszcze nie wystąpiło jest ukryte albo wyszarzone i im bliżej zdarzenia, tym kolor robi się intensywniejszy

Jezus maria, ile razy mam mówić. Nie chcę dostosować tej aplikacji pod Twoją wizję jakiegoś "kalendarza" czy czegoś, napisałem Ci dokładnie co chcę zrobić.

Chcę. Dodac. Odstępy. Pomiędzy. Elementami. W. Liście.

Jeśli masz pomysł jak to zrobić, chętnie wysłucham. Jeśli masz plan mi powiedzieć że mam tego nie robić, a zamiast tego mam robić coś innego - to dziękuję.

0
Riddle napisał(a):

Chcę. Dodac. Odstępy. Pomiędzy. Elementami. W. Liście.

Nie. Ma. Możliwości. Mieć. Zmiennych. Odstępów. Między. Elementami. W. Standardowym. QListView.
Musisz. Stworzyć. Własny. QItemView. Albo. Użyć. Sposobu. Z. QLabelami. Na. QWidgecie. Z. QVerticalLayout.

0

Chociaż, skoro dajesz radę umieszczać elementy w liście mające różną wysokość to otwiera furtkę do takiego rozwiązania - wstawiasz "puste", tj. nie mające tekstu elementy o odpowiedniej wysokości do listy pomiędzy tymi mającymi tekst. Wówczas będą działać jako swoiste QSpacerItemy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1