使用特定键盘键的 qt 橡皮筋选择

Posted

技术标签:

【中文标题】使用特定键盘键的 qt 橡皮筋选择【英文标题】:qt rubberband selection with specific keyboard key 【发布时间】:2013-12-21 14:11:50 【问题描述】:

我有一个QGraphicsView 和一个QGraphicsScene,我启用了

this->setDragMode(QGraphicsView::RubberBandDrag);

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

【问题讨论】:

【参考方案1】:

如果您说包含您的QGraphicsView 和场景的QMainWindow,一种方法是重载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 基类实现,这可能与您相关,也可能不相关。

【讨论】:

@Amazonasmann 我想知道这个答案是否解决了您的问题,或者是否缺少某些内容?或者也许这个问题在任何情况下都不再与您相关? 我遇到了这种方法的问题,如果我在拖动时切换拖动模式,即使松开鼠标按钮,橡皮筋也会在屏幕上冻结。 @AdrielJr 不确定我是否理解这个问题。拖动时切换模式是什么意思?移动中途松开控制键?还有什么? 您开始用鼠标拖动,以便在屏幕上看到白色的选择矩形,然后在不释放鼠标按钮的情况下调用 setDragMode(QGraphicsView::NoDrag)。就是这样,您的屏幕上有一个冻结的白色矩形,直到您将拖动模式设置回橡皮筋并再次开始拖动。 QT Bug 跟踪服务中存在一些关于此错误的问题:bugreports.qt.io/browse/QTBUG-51105bugreports.qt.io/browse/QTBUG-65186bugreports.qt.io/browse/QTBUG-2132【参考方案2】:

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

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

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 修复了这个错误 (https://bugreports.qt.io/browse/QTBUG-65186) 并将在 5.15 中部署

【讨论】:

以上是关于使用特定键盘键的 qt 橡皮筋选择的主要内容,如果未能解决你的问题,请参考以下文章

怎样禁用键盘的某个特定按键

qt 拖拽 修改大小

Java键盘密钥代码列表

Java 键盘键码列表

键盘上AIT键和ATL键的用法一样吗

使用橡皮筋选择在 QChartView 中选择 QLineSeries