qt橡皮筋选择与特定的键盘键

时间:2013-12-21 14:11:51

标签: c++ qt qgraphicsview qgraphicsscene rubber-band

我有QGraphicsViewQGraphicsScene我已启用

this->setDragMode(QGraphicsView::RubberBandDrag);

选择Rubberband。但是,在我的应用程序中,您需要按下CTRL键,然后移动鼠标以启动橡皮带选择。我可以在不制作自己的QRubberBand的情况下完成这项工作吗?如果没有,我该如何重新实现呢?

2 个答案:

答案 0 :(得分:2)

如果你说QMainWindow包含QGraphicsView和场景,那么一种方法就是重载QMainWindow的keyPressEventkeyReleaseEvent方法:

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);

}

只要按下CTRL,这将把选择模式设置为RubberBandDrag。再次释放该键时,拖动模式将重新设置为默认NoDrag,并且不会执行任何选择。 在这两种情况下,事件也会转发到QMainWindow基类实现,这可能与您有关,也可能不相关。

答案 1 :(得分:0)

Erik的回答对我来说效果不佳。如果我仍在拖动时释放键,橡皮筋将不会清除,并且在屏幕上保持可见,直到下一次选择为止。

因为QT仅在释放鼠标时清除橡皮筋,所以我的解决方法是在仍然处于“橡皮筋”模式下强制人工释放鼠标事件以正确清除它:

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);

}