2010-01-27 2 views
6

J'ai un QTableView dans lequel j'affiche un modèle personnalisé. Je voudrais attraper les clics de souris à droite afin que je puisse ouvrir une baisse contextuelle dans le menu déroulant sur les données de table sous-jacente:Qt4: événements de bouton de la souris QTableView non interceptés

MainWindow::MainWindow() 
{ 
    QTableView * itsView = new QTableView; 
    itsView->installEventFilter(this); 
    ... //Add other widgets and display them all 
} 

bool MainWindow::eventFilter(QObject * watched, QEvent * event) 
{ 
    if(event->type() == QEvent::MouseButtonPress) 
    printf("MouseButtonPress event!\n"); 
    else if(event->type() == QEvent::KeyPress) 
    printf("KeyPress event!\n"); 
} 

, je reçois Étrangement tous les événements KeyPress correctement: quand j'ai une cellule en surbrillance, puis appuyez sur une clé, j'obtiens le message "KeyPress event!". Cependant, je reçois seulement le message "MouseButtonPress event!" lorsque je clique sur la très fine bordure entourant la table entière.

Répondre

10

C'est parce que la Tableview est cette frontière mince ... Si vous voulez accéder au contenu du widget, vous devriez plutôt installer votre eventFilter sur la Viewview Tableview!

Nous vous proposons donc:

QTableView * itsView = new QTableView; 
itsView->viewport()->installEventFilter(this); 

Essayez cela, il devrait résoudre votre problème!

J'espère que ça aide!

+1

Plus de six ans plus tard et cette réponse m'a juste sauvé un tas de temps et d'agacement. Merci! – GuyGizmo

+1

@GuyGizmo Je suis heureux d'entendre ça :) Merci d'être passé;) –

2

Si vous devez afficher un menu contextuel, vous pouvez utiliser le signal customContextMenuRequested du tableview; Vous devez définir la stratégie du menu contextuel sur Qt::CustomContextMenu pour que ce signal soit déclenché. Quelque chose comme ceci:

... 
itsView->setContextMenuPolicy(Qt::CustomContextMenu); 
QObject::connect(itsView, SIGNAL(customContextMenuRequested(const QPoint &)), 
       this, SLOT(tableContextPopup(const QPoint &))); 
... 

void MainWindow::tableContextPopup(const QPoint & pos) 
{ 
    qDebug() << "show popup " << pos; 
} 

Espérons que cela aide, salutations.

Questions connexes