2012-04-10 1 views
1

У меня есть пользовательский QGraphicsView и пользовательский QGraphicsItem. Я хочу, чтобы Item обрабатывал мой клик, если я нажимаю элемент, иначе я хочу, чтобы щелчок обрабатывался View.MousePressEvent в поле зрения и элементы в Qt

Но когда я нажимаю на элемент, элемент обрабатывает щелчок. Хорошо. Но если я щелкнув в другом месте, клик не обрабатывается вообще. Весь код в моих классах, который имеет какое-либо отношение к mouseEvents, приведен ниже.

class CustomView : public QGraphicsView 
{ 
    Q_OBJECT 

public: 

    void mousePressEvent(QGraphicsSceneMouseEvent *event); 

}; 

void CustomView::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in view"; 
} 

class CustomItem : public QGraphicsItem 
{ 
public: 
    CustomItem(CustomView* widget) 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 

CustomItem::CustomItem(CustomView* widget){ 
    setFlag(ItemIsSelectable); 
    setFlag(ItemIsMovable); 
} 

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in item"; 
} 

Кажется, что когда я удалить функцию mousePressEvent из класса CustomItem и изменения в CustomView функцию mousePressEvent к:

void CustomView::mousePressEvent(QMouseEvent *event){ 
    cout << "pressing in view"; 
} 

CustomView обрабатывает все mouseEvents.

Как я могу позволить CustomItem обрабатывать клики в элементах, а CustomView обрабатывает все остальные клики?

спасибо.

EDIT

Так что теперь я изменил его:

class CustomView : public QGraphicsView 
{ 
    Q_OBJECT 

public: 

}; 

class CustomScene : public QGraphicsScene 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 


void CustomScene::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in scene"; 
} 

class CustomItem : public QGraphicsItem 
{ 
public: 
    CustomItem(CustomView* widget) 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 

CustomItem::CustomItem(CustomView* widget){ 
    setFlag(ItemIsSelectable); 
    setFlag(ItemIsMovable); 
} 

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in item"; 
} 

Щелк в сцене, но не в элементе получить обрабатываются на сцене. Но клики в элементах не обрабатываются самими элементами, вместо этого они обрабатываются сценой. Если вы не нажмете 2 раза очень быстро на предметы, они будут обработаны сценой и элементом.

Любые идеи?

+0

попробовать перекрывая 'QGraphicsScene :: mousePressEvent (QGraphicsSceneMouseEvent * MouseEvent)' метод в QGraphicsScene, а QGraphicsView – Kunal

+0

Я думаю, что ваш "CustomWidget :: mousePressEvent" должно быть "CustomView :: mousePressEvent" (или наоборот). – Anthony

+0

@ Kunal Ty для вашего ввода, я переместил mousePressEvent на сцену, но у меня все еще есть проблема с этим – fibera

ответ

4

QGraphicsView не очень хорошее место для обработки событий, специфичных для сцены. Вместо этого вам необходимо переопределить QGraphicsScene :: mousePressEvent. Я бы рекомендовал что-то вроде этого:

void CustomScene::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    if (itemAt(event) == NULL) 
    { 
    // do stuff if not clicked on an item 
    } 
    else 
    { 
    QGraphicsScene::mousePressEvent(event); // this forwards the event to the item 
    } 
} 

Обратите внимание, что QGraphicsScene :: ItemAt может дать вам трудности, если у вас есть элементы с флагом ItemIgnoresTransformations значение ИСТИНА. Посмотрите на документы для QGraphicsScene :: itemAt, чтобы решить эту проблему.

+0

Итак, я удалил QGraphicsView :: mousePressEvent (QGraphicsSceneMouseEvent) и добавил эту функцию к пользовательскому QGraphicsScene. Теперь, если я нажимаю где-то не на элемент, сцена обрабатывает мой клик. Если я нажимаю на элемент, сцена также обрабатывает мой клик. Но если я нажимаю 2 раза очень быстро на предмет, элемент и сцена обрабатывают мой клик. – fibera

+0

@fibera Я понял ошибку, которую сделал в своем ответе. Попробуйте отредактированный ответ и дайте мне знать, как это происходит. – Anthony

+0

Это делает трюк. Тай для вашего времени и терпения. – fibera