2010-06-23 6 views
24

Mam QTableWidget i chciałbym, aby naciśnięcie klawisza CTRL podczas kliknięcia nagłówka kolumny oznacza całą kolumnę. Uzyskanie indeksu kolumny nie stanowi problemu, ponieważ występuje sygnał sectionPressed, który daje mi bieżący indeks klikniętej kolumny. Jak mogę uzyskać stan modyfikatorów klawiatury po kliknięciu kolumny?Jak wykryć klawisz modyfikatora kliknięciem myszy w Qt

Odpowiedz

28

Wypróbuj QApplication::keyboardModifiers(), który jest zawsze dostępny

Na Qt 5, spróbuj QGuiApplication::keyboardModifiers().

+0

znalazłem go już teraz – tfl

+0

TERAZ natknąłem się na tę odpowiedź! Po przepisaniu wszystkiego jako brudnej podkategorii mogłem dostać się do obiektu 'event' :-) D'oh! –

+0

Podobny do @Freedom_Ben Patrzyłem również na wszystkie przykłady sugerujące podklasy lub filtr zdarzeń ... ale dzięki mojej wytrwałości (może to lenistwo: P) znalazłem tę odpowiedź. Działa jak urok ... DOKŁADNIE jak chciałem! Dzięki Roku za jego pomoc! – zeFree

7

Stan klawiszy modyfikujących klawiaturę można znaleźć, wywołując funkcję modyfikatorów() dziedziczoną po QInputEvent.

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

+0

wiem, ale nie mam żadnego obiektu w związaną szczelinę do sectionPressed inne niż indeks kolumny. Bez zdarzeń, bez nadawcy, nic. – tfl

+0

Być może można zapisać stan modyfikatorów w mouseReleaseEvent, które powinny wystąpić przed sygnałem. –

3

to jest naprawdę irytujące, muszę zainstalować eventFilter i usunąć sectionPressed uchwytu

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

obrębie eventFilter mogę sprawdzić pogoda klucz został naciśnięty jak tak

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

To działa dla mnie.

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

Można użyć QGuiApplication::queryKeyboardModifiers() który jest prostszy w obsłudze:

if(QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier)) 
{ 
    // Do a few things 
} 
Powiązane problemy