2010-06-23 6 views
24

J'ai un QTableWidget et je voudrais que l'appui sur CTRL tout en cliquant sur un en-tête de colonne marque la colonne entière. Pour obtenir l'index de la colonne n'est pas un problème car il ya un signal sectionPressed qui me donne l'index actuel de la colonne cliquée. Comment puis-je obtenir l'état de tous les modificateurs de clavier quand on clique sur une colonne?Comment détecter la touche de modification sur un clic de souris dans Qt

Répondre

28

Essayez QApplication::keyboardModifiers() qui est toujours disponible

Sur Qt 5, essayez QGuiApplication::keyboardModifiers().

+0

je l'ai déjà trouvé – tfl

+0

Maintenant, je tombe sur cette réponse! Après avoir réécrit tout comme une sous-classe désordonnée, je pouvais aller à l'objet 'event' :-) D'oh! –

+0

Similaire à @Freedom_Ben Je regardais aussi tous les exemples suggérant un sub-classing ou un event-filter ... mais grâce à ma persistance (peut-être c'est la paresse: P) que j'ai trouvé cette réponse. Fonctionne comme un charme ... EXACTEMENT comme je le voulais! Merci Roku pour son aide! – zeFree

7

L'état des touches de modification du clavier peut être trouvé en appelant la fonction modifiers(), héritée de QInputEvent.

http://doc.qt.io/qt-5/qmouseevent.html

+0

Je sais, mais je n'ai pas objet dans la fente associée à sectionPressed autre puis l'indice de la colonne. Pas d'événement, pas d'expéditeur, rien. – tfl

+0

Peut-être que vous pourriez enregistrer l'état des modificateurs dans mouseReleaseEvent qui devrait se produire avant le signal. –

3

cela est vraiment ennuyeux, je dois installer un eventFilter et retirez le sectionPressed gestionnaire

ui->tableWidget->horizontalHeader()->viewport()->installEventFilter(this); 

Dans le eventFilter je peux vérifier wether pression sur une touche comme si

bool MainWindow::eventFilter(QObject *object, QEvent *event) 
{ 
    if(event->type() == QEvent::MouseButtonPress) 
    { 
     if(Qt::ControlModifier == QApplication::keyboardModifiers()) 
     { 
      QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); 
      if(mouseEvent) 
      { 
       if(mouseEvent->button()== Qt::LeftButton) 
       { 
        ui->tableWidget->selectColumn(ui->tableWidget->itemAt(mouseEvent->pos())->column()); 
        return true; 
       } 
      } 
     } 
    } 

    return QWidget::eventFilter(object,event); 
} 
2

Cela fonctionne pour moi.

if (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == true) { 
4

Vous pouvez utiliser QGuiApplication::queryKeyboardModifiers() qui est plus simple à utiliser:

if(QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier)) 
{ 
    // Do a few things 
} 
Questions connexes