2010-06-23 52 views
24

我有一个QTableWidget,并希望按下CTRL,同时点击列标题标记整个列。要获得列索引不是问题,因为有一个sectionPressed信号,它给了我点击的列的当前索引。如何在单击列时获取键盘修饰符的状态?如何检测修改键在Qt中的鼠标点击

回答

28

尝试QApplication::keyboardModifiers()它始终可用

在Qt 5上,请尝试QGuiApplication::keyboardModifiers()

+0

我发现了这一切 – tfl 2010-06-24 05:29:40

+0

现在我偶然发现了这个答案!在我把所有东西都改写成凌乱的子类之后,我就可以看到事件对象:-)哦,哦! – 2013-05-02 17:38:55

+0

与@Freedom_Ben类似,我也在查看所有提示子类或事件过滤器的示例......但是由于我的持久性(可能是懒惰:P),我找到了这个答案。像魅力一样......就像我想要的一样!感谢Roku的帮助! – zeFree 2013-05-09 06:13:16

7

可以通过调用从QInputEvent继承的modifiers()函数来找到键盘修饰键的状态。

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

+0

我知道,但我有关联的插槽内没有对象sectionPressed其他则列索引。没有事件,没有发件人,没有。 – tfl 2010-06-23 08:50:04

+0

也许你可以在mouseReleaseEvent中保存修饰符状态,这应该发生在信号之前。 – 2010-06-23 09:11:35

3

这实在是烦人,我必须安装一个eventFilter并删除sectionPressed处理

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

内eventFilter我可以请检查是否一个键被按下,像这样

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

这适用于我。

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

您可以使用QGuiApplication::queryKeyboardModifiers()这是更简单的使用方法:

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