2010-06-23 13 views
24

Ho un QTableWidget e vorrei che premendo CTRL mentre si fa clic sull'intestazione di una colonna segna l'intera colonna. Per ottenere l'indice della colonna non è un problema poiché c'è una sezione Pressata che mi dà l'indice corrente della colonna cliccata. Come posso ottenere lo stato di qualsiasi modificatore di tastiera quando si fa clic su una colonna?Come rilevare il tasto modificatore al clic del mouse in Qt

risposta

28

Prova QApplication::keyboardModifiers() che è sempre disponibile

Su Qt 5, provare QGuiApplication::keyboardModifiers().

+0

l'ho trovato già – tfl

+0

ORA inciampo su questa risposta! Dopo ho riscritto tutto come sottoclasse disordinato, in modo da poter ottenere l'oggetto 'event' :-) D'oh! –

+0

Simile a @Freedom_Ben stavo anche guardando tutti gli esempi che suggeriscono la sottoclasse o il filtro eventi ... ma grazie alla mia persistenza (potrebbe essere la pigrizia: P) che ho trovato questa risposta. Funziona come un fascino ... ESATTAMENTE come volevo! Grazie Roku per il suo aiuto! – zeFree

7

Lo stato dei tasti di modifica tastiera può essere trovato chiamando la funzione modifiers(), ereditata da QInputEvent.

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

+0

so ma non ho alcun oggetto all'interno dello slot associato alla sectionPressed altri poi l'indice di colonna. Nessun evento, nessun mittente, niente. – tfl

+0

Forse potresti salvare lo stato dei modificatori in mouseReleaseEvent che dovrebbe verificarsi prima del segnale. –

3

questo è davvero fastidioso, devo installare un eventFilter e rimuovere il sectionPressed gestore

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

All'interno del eventFilter posso controllare castrato un tasto è stato premuto in questo modo

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

Questo funziona per me.

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

È possibile utilizzare QGuiApplication::queryKeyboardModifiers() che è più semplice da usare:

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