2010-11-17 6 views
0

У меня есть матрица QGraphicsItem's в QGraphicsScene, и когда я нажимаю элемент, он меняет цвет. Это реализовано с помощью mousePressEvent(). Я хочу, чтобы иметь возможность щелкнуть и удерживать, а затем переместить курсор на другие объекты QGraphicsItem и изменить их цвет, следовательно, вызвать их mousePressEvent().Одно нажатие мыши для нескольких QGraphicsItem's в QT

Проблема заключается в том, что из-за мыши, захватывающей первый элемент, я нажимаю «сохраняет» все события, а hoverEnterEvent() не запускается. Я попытался добавить ungrabMouse() в mousePressEvent(), но это не помогло.

Я предполагаю, что одним из решений было бы сделать перетаскивание QGraphicsitem и использовать функции перетаскивания QT для этого. На самом деле у меня есть это:

void dragEnterEvent(QGraphicsSceneDragDropEvent *event) 
{ 
    changeColor(); 
} 

и когда я перетащить текст из приложения над элементами, которые он работает, как я хочу его, но не тогда, когда я «перетащить» а QGrahphicsItem.

Это единственное решение, позволяющее перетаскивать QGraphicsItem, чтобы иметь возможность запускать события, нависая над ними нажатой кнопкой мыши?

ответ

1

Я нашел решение самостоятельно. Я добавил все свои QGraphicsRectItem в QGraphicsItemGroup и реализовал события для этой группы. В группе :: MouseMoveEvent() Я проверяю положение курсора и применяю событие к его дочерним элементам. Это выглядит так:

void Group::mouseMoveEvent (QGraphicsSceneMouseEvent * event) 
{ 
    if (boundingRect().adjusted(0,0,-1,-1).contains(event->pos())) 
    { 
     if (CellCoordinate(event->pos()) != lastChangedCell_) { 
      lastChangedCell_ = CellCoordinate(event->pos()); 
      modifyCell(CellCoordinate(event->pos())); 
     } 
    } 
} 

Если у вас есть такая же проблема и вам нужно больше информации, не стесняйтесь обращаться ко мне.

+0

+1: Спасибо, за предоставление вашего решения! –

1

Я бы рекомендовал использовать mouseMoveEvent().

Редактировать: mouseMoveEvent() родителей QGraphicsView.

+0

К сожалению, это не сработает: «Если вы получили это событие, вы можете быть уверены, что этот элемент также получил событие нажатия мыши, и этот элемент является текущим захватчиком мыши». (http://doc.qt.nokia.com/4.7/qgraphicsitem.html#mouseMoveEvent) – Colin

+0

Ну, он не будет работать в mouseMoveEvent для QGraphicsItem. Я думаю, что решение заключается в реализации этой функции на уровне QGraphicsView, и этот mouseMoveEvent этого класса может быть полезен. – Colin

+0

Хм, хорошо, это странное поведение, это не совсем соответствует остальной части Qt. В этом случае, да, лучше всего иметь дело с взаимодействием с пользователем на более высоком уровне (то есть QGraphicsView). –