2010-06-23 11 views
24

Tengo un QTableWidget y me gustaría que presionar CTRL mientras hace clic en el encabezado de una columna marca toda la columna. Obtener el índice de la columna no es un problema ya que hay una señal Presionada que me da el índice actual de la columna en la que se hace clic. ¿Cómo puedo obtener el estado de los modificadores de teclado cuando se hace clic en una columna?Cómo detectar la tecla modificadora con el clic del mouse en Qt

Respuesta

28

Probar QApplication::keyboardModifiers() que siempre está disponible

En Qt 5, intente QGuiApplication::keyboardModifiers().

+0

lo encontré todo listo – tfl

+0

¡AHORA tropecé con esta respuesta! Después de reescribir todo como una subclase desordenada para poder acceder al objeto 'event' :-) D'oh! –

+0

Similar a @Freedom_Ben También estaba viendo todos los ejemplos que sugieren subclasificación o filtro de eventos ... pero gracias a mi persistencia (puede ser su pereza: P) encontré esta respuesta. Funciona como un encanto ... ¡EXACTAMENTE como yo quería! Gracias Roku por su ayuda! – zeFree

7

El estado de las teclas modificadoras del teclado se puede encontrar llamando a la función de modificadores(), heredada de QInputEvent.

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

+0

sé, pero tengo ningún objeto dentro de la ranura asociada a otra sectionPressed entonces el índice de la columna. Sin evento, sin remitente, nada. – tfl

+0

Tal vez podría guardar el estado de los modificadores en mouseReleaseEvent que debería ocurrir antes de la señal. –

3

esto es muy molesto, tengo que instalar un EventFilter y retire la sectionPressed manejador

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

Dentro del EventFilter puedo comprobado si una tecla se ha pulsado igual que

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

Esto funciona para mí.

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

Puede utilizar QGuiApplication::queryKeyboardModifiers() que es más fácil de usar:

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