QCalendarWidget - prawy klawisz myszy nie zmienia selectedDate()

QCalendarWidget - prawy klawisz myszy nie zmienia selectedDate()
kotlar
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 11 lat
  • Postów:33
0

Witam,
Mam problem z QCalendarWidget, polega on na tym że nie wiem jak zrobić pewną rzecz.
Mianowicie:
Na widgecie mam element QCalendarWidget.
Klikając lewym klawiszem myszy po QCalendarWidget zmieniam selectedDate() - standardowo.
Klikając prawym klawiszem myszy wywołuje menu kontekstowe. Steruje nim sygnał customContextMenuRequested.
Do tego momentu jest wszystko ok ale ja mam pewne widzimisię a mianowicie menu kontekstowe powinno mieć zawartość zależną od dnia na którym zostało wywołane i tutaj jest problem:(
Bardziej szczegółowo wygląda to tak:
Aktualne selectedDate() na QCalendarWidget to powiedzmy 12.12.2012 a ja klikam prawym na 21.12.2012 i pojawia mi się menu kontekstowe ale do dnia 12.12.2012 bo tam aktualnie jest focus QCalendarWidget i to jest nie tak jak bym chciał.

Ogólnie chodzi o to jak zrobić aby prawy klawisz myszy zmieniał selectedDate() na QCalendarWidget?

Nadmienie jeszcze żę nadpisywałem QCalendarWidget i tam metodę void mousePressEvent( QMouseEvent * event ); ale nie tedy droga. Nadpisałem też bool event( QEvent * event ); ale tez nie tedy droga. Ogólnie temat jest lekko beznadziejny.

Może ktoś ma jakiś pomył jak to ugryźć.

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 godziny
0

rozumiem, że chcesz po prostu wyłuskać datę dla której kliknięto prawy przycisk myszy (a możesz dostać tylko selectedDate()).
Jeśli tak, czy przeszkadza ci natychmiastowa zmiana selectedDate?

Próbowałeś sprawdzić: void QCalendarWidget::clicked ( const QDate & date ) [signal] czy reaguje na prawy przycisk?


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
kotlar
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 11 lat
  • Postów:33
0

Zmiana selectedDate() jest jak najbardziej wskazana i pożądana ale nie wiem jak to uczynić:(

MarekR22
zawsze można oszukać, przez nadpisanie zachowania zdarzeń myszy (tak by prawy klawisz powodował równocześnie zdarzenia lewego klawisza) - trochę to skomplikowane, ale zadziała na 100%. Sprawdziłeś sygnał QCalendarWidget::clicked ?
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 godziny
1

Popatrzyłem w kod QCalendarWidget
Niestety ani sygnał clicked ani nadpisywanie zachowania myszy nie pomoże.
QCalendarWidget zawiera w sobie QCalendarView i tam się dzieje sporo logiki oraz sprawy związane z myszą.
QCalendarView jest wewnętrzną klasą Qt (nie eksportowalną), ale można się dobrać do tego obiektu przez nazwę:

Kopiuj
QTableView *calendarView = qobject_cast<QTableView *>(calendarWidget->findChild (QLatin1String("qt_calendar_calendarview")));

co z tym potem zrobić to napiszę potem.


To leci tak, zapamiętaj calendarView, gdzieś a potem w tym slocie, który odbiera sygnał customContextMenuRequested: ```cpp void JakisTwojQObject::OnCustomContextMenuRequested(const QPoint & pos) // ten slot { QCalendarWidget *widget = qobject_cast<qcalendarwidget *="*">(sender()); if (widget == 0) return;
 // wyławiamy QCalendarView jako QTableView poprzez nazwę
 QTableView *calendarView = qobject_cast<QTableView *>(widget->findChild (QLatin1String("qt_calendar_calendarview")));
 Q_ASSERT(calendarView);

 QPoint p = calendarView->mapFrom(widget, pos);
 QModelIndex index = calendarView->indexAt(p);
 QDate date = index->data().toDate(); // Qt::DisplayRole
 if (date.isValid()) { // sprawdź czy kliknięto datę? czy inną kolumnę?
       // tu generujesz menu kontekstowe uzależnione już od daty klikniętej prawym przyciskiem
       ....
 }

}

Kopiuj
gdzie JakisTwojQObject to może być dowolny klasa dziedziczaca QObject z logiką twojej aplikacji (nie musisz dziedziczyć po QCalendarWidget).

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22
kotlar
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 11 lat
  • Postów:33
0

Również próbowałem już nadpisywać rożne metody ale tak jak piszesz w poście powyżej nic to nie pomaga:( Czekam więc co wymyślisz bo mi się pomysły już skończyły. Przyznam szczerze że pierwszy raz spotykam się z taką sytuacją w Qt, że niby blacha sprawa sprawia takie trudności:(

MarekR22
jak widzisz da się, akurat robiłem update kiedy udzieliłes odpowiedzi. Nie jest to piękne rozwiązanie, bo się lekko dłubie po wewnętrznych bebechach, więc nie masz gwarancji kompatybilności, ale to jest tak stara klasa, że raczej już się nie będzie zmieniać (najwyżej kosmetycznie).
kotlar
ok, wstępnie dziękuje za pomoc, dzisiaj nie mam już możliwości ale jutro rano spróbuje twoje rozwiązanie wdrożyć:)
kotlar
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 11 lat
  • Postów:33
0

Napisze nowego posta niby pod samym sobą ale rozjaśni to komunikację:)

Wiec tak,
Rozwianie zaproponowane powyżej działa, jest może mało eleganckie ale udaje się osiągnąć zamierzony cel:)
Poniżej działający kod:

Kopiuj
 
void OknoPanelInfo::zrobMenuKontekstoweKalendarz(const QPoint & point)
{
	QCalendarWidget *widget = qobject_cast<QCalendarWidget *>(sender());
	
	if( widget == NULL )
		return;

	QTableView *calendarView = qobject_cast<QTableView *>(widget->findChild<QTableView *>( QLatin1String("qt_calendar_calendarview") ) );

	if( calendarView == NULL )
		return;

	QPoint p = calendarView->mapFrom( widget, point );
	QModelIndex index = calendarView->indexAt(p);

	if( !index.isValid() )
		return;

	bool wynik;
	int dzien = index.data().toInt( &wynik );

	if( !wynik )
		return;

	QDate data = QDate( widget->yearShown(), widget->monthShown(), dzien );

	if( index.row() <= 1 && dzien > 15 )
		data = data.addMonths( -1 );

	if( index.row() >= 4 && dzien < 15 )
		data = data.addMonths( 1 );

	widget->setSelectedDate( data );


	//tutaj robimy juz menu kontekstowe dla naszej daty:)
}
MarekR22
przy findChild qobject_cast jest już niepotrzebny.
kotlar
fakt - dzięki:)
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 godziny
0

Fakt troszkę poprzekręcałem (z modelu lecą int'y a nie QDate), ale widzę, że załapałeś koncept.
Popatrz w tu by lepie zrozumieć co się dzieje.
Natomiast tu i tu widać kiedy musisz uwzględnić przesunięcie kolumn i wierszy (gdybyś potrzebował zrobić to dokładniej).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
kotlar
Analizowałem źródła:) przez spora czasu próbowałem operować tam na modelach aby to lepiej zrobić ale niestety nie udało się:( Przesunięcia wierszy zrobiłem przy pomocy tych dwóch if-ów niby łopatologicznie ale działa:) Dzięki za pomoc:)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.