2010-06-23 6 views
24

Ich habe eine QTableWidget und möchte, dass Drücken der STRG-Taste beim Klicken auf eine Spaltenüberschrift markiert die ganze Spalte. Der Spaltenindex ist kein Problem, da es ein sectionPressed Signal gibt, das mir den aktuellen Index der Spalte anzeigt. Wie kann ich den Status von Tastaturmodifizierern erhalten, wenn auf eine Spalte geklickt wird?Wie erkennt man die Modifier-Taste bei Mausklick in Qt

Antwort

28

Versuchen Sie QApplication::keyboardModifiers() ist immer verfügbar

Auf Qt 5 versuchen Sie QGuiApplication::keyboardModifiers().

+0

ich habe es schon gefunden – tfl

+0

JETZT stolpere ich über diese Antwort! Nachdem ich alles als eine unordentliche Unterklasse umgeschrieben hatte, konnte ich an das 'Event'-Objekt kommen :-) D'oh! –

+0

Ähnlich wie bei @Freedom_Ben habe ich mir auch alle Beispiele angeschaut, die auf Sub-Classing oder Event-Filter hindeuten ... aber dank meiner Beharrlichkeit (vielleicht ist es Faulheit: P) fand ich diese Antwort. Funktioniert wie ein Charme ... GENAU wie ich wollte! Danke Roku für seine Hilfe! – zeFree

7

Der Status der Tastaturmodifizierertasten kann durch Aufrufen der Funktion modifiers() gefunden werden, die von QInputEvent geerbt wurde.

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

+0

Ich weiß, aber ich habe kein Objekt im zugehörigen Schlitz anderen sectionPressed um dann dem Spaltenindex. Kein Ereignis, kein Sender, nichts. – tfl

+0

Vielleicht könnten Sie den Modifier-Status in mouseReleaseEvent speichern, der vor dem Signal auftreten sollte. –

3

dies ist wirklich ärgerlich, ich habe eine event installieren und entfernen die sectionPressed Handler

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

Im event ich, ob ein Schlüssel überprüfen wurde wie so gedrückt

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

Das funktioniert für mich.

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

können Sie QGuiApplication::queryKeyboardModifiers() verwenden, die einfacher zu bedienen ist:

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