Mam QTableView, w nim 3 kolumny i teraz chce bez naciskania myszy wychwycić jej ruch nad 1, 2, lub 3 nagłówkiem kolumny. Wejście myszy w nagłówek jest proste obsługuje to w event->type() == QEvent::Enter. Mam zainstalowany filtr zdarzeń oraz śledzenie myszy. Pytanie jak uzyskać index nagłówka kolumny gdy znajduje się nad nim mysz?

- Rejestracja:około 17 lat
- Ostatnio:11 minut
- Rejestracja:prawie 13 lat
- Ostatnio:ponad 10 lat
- Postów:271
Byś się zdziwił ile czasu spędziłem w dokumentacji Qt... ale ok źle się wyraziłem - wejście w nagłówek i wyłapanie tej pozycji mam i robię tak
bool TableView::eventFilter( QObject * watched, QEvent * event )
{
if( watched == this->horizontalHeader() ) {
if( event->type() == QEvent::Enter ) {
QMouseEvent * mouseevent = static_cast< QMouseEvent * >( event );
qDebug()<< "header mouse event..." << this->horizontalHeader()->logicalIndexAt( mouseevent>pos().y() );
return true;
}
}
return QTableView::eventFilter( watched, event );
}
tylko teraz żeby złapać kolejną pozycję muszę wyjść z nagłówka i najechać z powrotem na innym indexie. Wygląda to tak jakbym nie mógł wyłapać QEvent::mousemove ( tu go nie wkleiłem ) w filtrze zdarzeń na nagłówku kolumny. Czy muszę stworzyć swoja podklasę QHeaderView i tam próbować łapać ruch myszki nad kolejnymi częściami nagłówka?

- Rejestracja:około 17 lat
- Ostatnio:11 minut
trzeba zadawać pytania konkretnie. Ja cię zrozumiałem, że masz współrzędne myszki i chcesz to przeliczyć na kolumnę, że z resztą nie ma problemu.
Zresztą jest chyba oczywiste, że event który łapiesz zdarza się tylko, gdy wchodzisz kursorem na TableView.
Nie wiem po kiego grzyba męczysz event filter skoro i tak dziedziczysz po klasie.
Ja bym zrobił to tak:
void TableView::mouseMoveEvent(QMouseEvent * event) {
QTableView::mouseMoveEvent(event);
int newColumn = columnAt(event->x());
if (newColumn!=hoverOverColumn)) {
hoverOverColumn = newColumn;
emit hoverOverColumnChanged(newColumn);
}
}
Oczywiście trzeba włączyć śledzenie myszy http://qt-project.org/doc/qt-5.1/qtwidgets/qwidget.html#mouseTracking-prop.
- Rejestracja:prawie 13 lat
- Ostatnio:ponad 10 lat
- Postów:271
Dzięki to rozwiązało część moich problemów jednak nadal zostaje jeden - metoda TableView::mouseMoveEvent(QMouseEvent * event) nie reaguje na ruch gdy myszka jest nad nagłówkiem kolumny. I teraz gdy wjadę na 1 element nagłówka to poda mi że index = 0 i jest ok ale w momencie gdy bezpośrednio z 1 przesunę kursor na 2 element nagłówka to już tej zmiany nie zauważa mimo że mam włączone śledzenie myszy
this->horizontalHeader()->setMouseTracking( true );
edit :: rozwiązałem problem w taki sposób
if( event->type() == QMouseEvent::HoverMove ) {
qDebug()<< "mouse move event..." << this->columnAt( mouseevent->x() );
}
MarekR22 nie wiem czy to jakoś znacząco wpływa na wydajność programu ( ? ) ale łatwiej obsługuje mi się wszystkie zdarzenia obiektu i podobiektów w eventfilter.

- Rejestracja:około 19 lat
- Ostatnio:14 dni
- Lokalizacja:Warszawa
- Postów:1454
Bo nagłówek to oddzielny obiekt QHeaderView,QTableView to tylko ta tabelka z komórkami.
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.