Как получить событие выхода из QGraphicsItem с уведомлением о focusOut

у меня есть класс, реализованный из QGraphicsItem, который называется Node.

у меня есть "узел" в форме прямоугольника, и я могу что-то сделать, когда пользователь нажал на него

я использую события mousePress и mouseRelease.

но я хочу получать уведомления, когда пользователь щелкнул «из» прямоугольной формы.

я пытался реализовать эти функции:

QT-код:

void Node::focusInEvent ( QFocusEvent * event){
cout<<"in"<<endl;
update();

QGraphicsItem::focusInEvent(event);
}
void Node::focusOutEvent ( QFocusEvent * event ){
cout<<"out"<<endl;
update();
QGraphicsItem::focusOutEvent(event);

}
void Node::hoverEnterEvent(QGraphicsSceneHoverEvent *event){
cout<<"out"<<endl;
}

они не реагируют, если я нажимаю внутри или вне прямоугольника. Должен ли я установить логику самостоятельно, например, получить положение мыши и контролировать, находится ли оно вне прямоугольника? или есть встроенный метод?

или как объект «Узел» может узнать, был ли нажат другой объект «Узел»?

также мне интересно, погуглил, но не смог найти, когда срабатывает focusinevent и focusoutevent? Я предполагаю, что focusOutEvent должен работать, когда я щелкнул элемент, а затем вышел из него, я ошибаюсь?

спасибо за идею.


person merveotesi    schedule 29.07.2011    source источник


Ответы (2)


Вызывали ли вы метод setFlags вашего графического элемента с помощью QGraphicsItem: :ItemIsSelectable или QGraphicsItem::ItemIsMovable?

Согласно документу QT.

По умолчанию никакие флаги не включены.

person O.C.    schedule 29.07.2011
comment
Большое спасибо, я вызвал setFlags(ItemIsSelectable|ItemIsMovable|ItemIsFocusable); и он работает отлично. Но когда я нахожусь в другом окне, а затем нажимаю на окно приложения, фокус и фокус работают один раз, я буду искать это. Я просмотрел документ перед тем, как спросить, но не увидел, что мне нужно устанавливать флаги. Еще раз спасибо - person merveotesi; 29.07.2011

При создании узлов необходимо сделать следующее:

setFlag( QGraphicsItem::ItemIsFocusable );
setAcceptHoverEvents( true );

Первая строка делает ваш элемент действительно способным получать фокус, а вторая делает так, чтобы ваш элемент уведомлялся о событиях мыши.

person Chris    schedule 29.07.2011
comment
Спасибо за ответ, и у вас есть представление о том, когда я нахожусь в другом окне, а затем нажимаю на окно приложения, фокус и фокус работают один раз, даже если я не нажимал на свой qgraphicsitem. Событие фокуса окна срабатывает, я думаю, как этого избежать? - person merveotesi; 29.07.2011