我有QGraphicsView
和QGraphicsScene
我已启用
this->setDragMode(QGraphicsView::RubberBandDrag);
选择Rubberband。但是,在我的应用程序中,您需要按下CTRL键,然后移动鼠标以启动橡皮带选择。我可以在不制作自己的QRubberBand的情况下完成这项工作吗?如果没有,我该如何重新实现呢?
答案 0 :(得分:2)
如果你说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,这将把选择模式设置为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);
}