Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ qt橡胶带使用特定键盘键进行选择_C++_Qt_Qgraphicsview_Qgraphicsscene_Rubber Band - Fatal编程技术网

C++ qt橡胶带使用特定键盘键进行选择

C++ qt橡胶带使用特定键盘键进行选择,c++,qt,qgraphicsview,qgraphicsscene,rubber-band,C++,Qt,Qgraphicsview,Qgraphicsscene,Rubber Band,我有一个QGraphicsView和一个qgraphicscene并且我已启用 this->setDragMode(QGraphicsView::RubberBandDrag); 用于橡胶带选择。但是,在我的应用程序中,您需要按CTRL键,然后移动鼠标来启动橡皮筋选择。我能在不制作自己的QRubberBand的情况下实现这一点吗?如果没有,我如何重新实现它?如果你说一个QMainWindow包含你的QGraphicsView和场景,一种方法是重载QMainWindow的keyPressE

我有一个
QGraphicsView
和一个
qgraphicscene
并且我已启用

this->setDragMode(QGraphicsView::RubberBandDrag);

用于橡胶带选择。但是,在我的应用程序中,您需要按CTRL键,然后移动鼠标来启动橡皮筋选择。我能在不制作自己的QRubberBand的情况下实现这一点吗?如果没有,我如何重新实现它?

如果你说一个
QMainWindow
包含你的
QGraphicsView
和场景,一种方法是重载QMainWindow的
keyPressEvent
keyReleaseEvent
方法,如下所示:

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键,这会将选择模式设置为“橡皮拖动”。再次释放按键时,拖动模式被设置回默认的
NoDrag
,不执行任何选择。
在这两种情况下,事件也会被转发到QMainWindow基类实现,该实现可能与您相关,也可能与您无关。

Erik的回答对我来说不太合适。如果我在拖动的同时松开该键,橡皮筋将不会清除,并在屏幕上保持可见,直到下一次选择

由于QT仅在鼠标释放时清除橡皮筋,我的解决方法是在仍处于Rubberband模式时强制执行人工鼠标释放事件,以正确清除它:

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

}

更新:Qt修复了这个bug(),并将在5.15版本中部署。Amazonasmann我想知道这个答案是否解决了您的问题,或者它是否缺少什么?或者在任何情况下,这个问题都与您无关?我对这种方法有一个问题,如果我在拖动时切换拖动模式,即使松开鼠标按钮,橡皮筋也会在屏幕上冻结。@AdrielJr不确定我是否理解这个问题。拖动时切换模式是什么意思?在运动中间释放控制键?还有什么?你开始用鼠标拖动,以便在屏幕上看到白色的选择矩形,然后在不释放鼠标按钮的情况下,调用setDragMode(QGraphicsView::NodeRag)。也就是说,您的屏幕上有一个冻结的白色矩形,直到您将拖动模式设置回橡皮筋并再次开始拖动。QT Bug track服务中有一些关于此Bug的问题: