QTableView - przechwytywanie myszy nad nagłówkiem

QTableView - przechwytywanie myszy nad nagłówkiem
EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
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?

MarekR22
minus za brak umiejętności czytania dokumentacji
EM
i teraz taki brzydki czerwony kolor na głównej stronie pod moim postem....ajjjj ;d
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:11 minut
0

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
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

Kopiuj
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?

edytowany 1x, ostatnio: emacs
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:11 minut
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:

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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
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

Kopiuj
this->horizontalHeader()->setMouseTracking( true );

edit :: rozwiązałem problem w taki sposób

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

edytowany 3x, ostatnio: emacs
MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:14 dni
  • Lokalizacja:Warszawa
  • Postów:1454
0

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


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
EM
To wiem ale czy to jakoś bardzo źle że obsługuje wszystkie / większość zdarzeń QHeaderView i samego QTableView w eventfilter?
MasterBLB
Skoro to rozumiesz i działa,to jak dla mnie może być.Ale osobiście to zrobiłbym mniej więcej w takim stylu jak MarekR22

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.