QCalendarWidget - prawy klawisz myszy nie zmienia selectedDate()

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źć.

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?

0

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

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ę:

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
       ....
 }

}

gdzie JakisTwojQObject to może być dowolny klasa dziedziczaca QObject z logiką twojej aplikacji (nie musisz dziedziczyć po QCalendarWidget).
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:(

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:

 
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:)
}
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).

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