2010-06-23 77 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 
}