Qt резинкой на выбор с конкретной клавишей клавиатуры

У меня есть QGraphicsView и QGraphicsScene и я включил

this->setDragMode(QGraphicsView::RubberBandDrag);

для выбора резинкой. Тем не менее, в моем приложении было бы целесообразно нажать клавишу CTRL, а затем переместить мышь, чтобы начать выбор резиновой ленты. Могу ли я сделать это, не делая свой собственный QRubberBand? Если нет, как я могу переопределить это?

1 ответ

Если вы сказали QMainWindow который содержит ваш QGraphicsView и сцена, один из способов сделать это будет перегружать keyPressEvent а также keyReleaseEvent методы QMainWindow такие:

void MyMainWindow::keyPressEvent( QKeyEvent * event )
{
  if( event->key() == Qt::Key_Control ) {
    graphicsView->setDragMode(QGraphicsView::RubberBandDrag);
  }
  QMainWindow::keyPressEvent(event);

}


void MyMainWindow::keyReleaseEvent( QKeyEvent * event )
{
  if( event->key() == Qt::Key_Control ) {
    graphicsView->setDragMode(QGraphicsView::NoDrag);
  }
 QMainWindow::keyReleaseEvent(event);

}

Это установит режим выбора на RubberBandDrag пока CTRL нажата. Когда клавиша отпущена снова, режим перетаскивания возвращается к значению по умолчанию NoDrag и выбор не выполняется. В обоих случаях событие также перенаправляется в реализацию базового класса QMainWindow, которая может иметь или не иметь отношение к вам.

Ответ Эрика не сработал для меня. Если я отпущу клавишу во время перетаскивания, резиновая полоса не будет очищена и останется видимой на экране до следующего выбора.

Поскольку QT очищает резинку только при отпускании мыши, мой обходной путь состоял в том, чтобы принудительно вызвать событие искусственного отпускания мыши, пока он находится в режиме Rubberband, чтобы он был очищен должным образом:

void MyQGraphisView::keyReleaseEvent( QKeyEvent * event )
{
    if( event->key() == Qt::Key_Control ) {
        mouseReleaseEvent(new QMouseEvent(QApplicationStateChangeEvent::MouseButtonRelease, mousePosOnScene, Qt::LeftButton, Qt::NoButton, Qt::NoModifier));   
        setDragMode(QGraphicsView::NoDrag);
    }
    MyQGraphisView::keyReleaseEvent(event);

}
Другие вопросы по тегам