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