2014-02-18 47 views
0

我正在使用QTableView顯示圖標列表,用戶可以用鼠標選擇一些圖標並控制按鍵,並且我可以處理這些選擇。但是我想禁用在QTableView上使用Shift +鼠標左鍵。當GUI運行時,永久禁用Qt中的移位?

在GUI運行的過程中,有什麼辦法可以完全禁用shift鍵嗎?我能夠使用安裝在QTableView的視口上的eventFilter檢測到shift鍵的按下,但我無法找到任何方式來完全使shift鍵在用戶同時按下shift鍵和鼠標左鍵時不活動。

我的事件過濾器是如下:

bool MainWindow::eventFilter(QObject* obj, QEvent *ev) 
{ 
    if(obj == ui->listOfImages->viewport()) 
    { 
     if(ev->type() == QEvent::MouseButtonPress) 
     { 
      QMouseEvent * mouseEv = static_cast<QMouseEvent*>(ev); 
      if((mouseEv->buttons() & Qt::LeftButton) && (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == true) && (QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier) == false)) 
      { 
       controlButtonCounter++; 
       fetch = true; 
       //I use these variables for some purposes. 
       return QObject::eventFilter(obj,ev); 
      } 
      else if((mouseEv->buttons() & Qt::LeftButton) && (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == false) && (QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier) == false)) 
      { 
       if(selectedImages.size()>0) 
       { 
        ui->listOfImages->clearSelection(); 
        selectedImages.clear(); 
        selectedList.clear(); 
        ui->selectedFiles->clear(); 
        ui->selectedFiles->show(); 
       } 
       fetch = false; 
       controlButtonCounter = 0; 
       //I use these variables for some purposes. 
      } 
      else if((mouseEv->buttons() & Qt::LeftButton) && (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == false) && (QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier) == true)) 
      { 
       qDebug()<<"Shift button pressed!"; 
       // Don't how to prevent shift button from selecting multiple icon. 
      } 
     } 
    } 
    return QObject::eventFilter(obj,ev); 
} 
+2

爲什麼你想呢?改變控件通常的工作方式可能會使用戶感到迷惑和煩擾。如果你真的想,你可以從你的事件過濾器返回false,如果你檢測到移位按下。這應該防止事件傳播到視口。 –

+0

因爲對於qt中的一些錯誤,我無法使用shift +鼠標左鍵檢測選擇了哪些圖標。因此,最好的選擇是完全禁用QTableView上的shift按鈕。 @j_kubik –

+0

順便說一句你應該從鼠標事件的事件過濾器中返回false,而不是鍵盤。 –

回答

1

我會處理的鼠標點擊和按鈕狀態以下列方式:

bool MyWidget::eventFilter(QObject *obj, QEvent *event) 
{ 
    [..] 
    if (event->type() == QEvent::MouseButtonPress || 
     event->type() == QEvent::MouseButtonRelease) { 
     Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers(); 

     if (modifiers & Qt::ShiftModifier) { 
      // Filter the event, when mouse pressed/released 
      // with the shift key pressed. 
      return true; 
     } 
    } 
    [..] 
    return false; 
} 
+0

我不太明白你的觀點,我改變了我的問題,並添加了我的事件過濾器的代碼,請你看看它,並說我應該怎麼做才能禁用Shift鍵,當我檢測到它是按下鼠標左鍵。 –

+0

@the_naive,如果您檢測到條件,應該過濾事件,則只需從事件過濾器返回true。 – vahancho