QTableView - przechwytywanie myszy nad nagłówkiem

0

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?

0

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?

1

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.

0

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.

0

Bo nagłówek to oddzielny obiekt QHeaderView,QTableView to tylko ta tabelka z komórkami.

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