【问题标题】:How to get event of clicking out of a QGraphicsItem, being notified of focusOut如何获取点击QGraphicsItem的事件,通知focusOut
【发布时间】:2011-07-29 22:46:15
【问题描述】:

我有一个从 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;
}

如果我点击进入或离开矩形,这些不会做出反应。 我应该自己设置一个逻辑,例如获取鼠标位置并控制它是否超出矩形? 还是有内置方法?

或者“Node”对象如何知道是否点击了其他 Node 对象?

我也想知道,谷歌搜索但找不到焦点事件和焦点事件何时触发?我想当我点击项目时,focusOutEvent 必须工作,然后退出项目,我错了吗?

谢谢你的想法。

【问题讨论】:

    标签: qt focus qgraphicsitem


    【解决方案1】:

    您在构建节点时需要执行以下操作:

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

    第一行使您的项目实际上能够接收焦点,而后者使您的项目能够收到鼠标事件的通知。

    【讨论】:

    • 感谢您的回复,您是否知道我何时在另一个窗口中,然后单击到应用程序窗口,即使我没有单击到我的 qgraphicsitem,focusin 和 focusout 也会工作一次.我认为触发了windows focusin事件,如何避免这种情况?
    【解决方案2】:

    您是否使用 QGraphicsItem::ItemIsSelectableQGraphicsItem::ItemIsMovable 调用了图形项的 setFlags 方法?

    根据 QT 文档。

    默认情况下,不启用任何标志。

    【讨论】:

    • 非常感谢,我打电话给 setFlags(ItemIsSelectable|ItemIsMovable|ItemIsFocusable);它运行良好。但是当我在另一个窗口中,然后单击到应用程序窗口时,focusin 和 focusout 工作一次,我要搜索这个。我在问之前看过文档,但没有看到我必须设置标志。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    相关资源
    最近更新 更多