运行效果

代码
在Qt框架中,QGraphicsScene 本身并不直接管理控件的焦点状态,但它管理着场景中的图形项(QGraphicsItem)。通常,焦点管理更多是与具体的控件(如 QWidget)相关,而不是与图形项直接相关。不过,你可以通过事件过滤器或信号槽机制来追踪和管理场景中的项目交互,从而间接确定哪个图形项当前被用户交互(例如,点击或键盘事件)。
如果你想要实现类似的功能,可以考虑以下步骤:
-
为图形项安装事件过滤器:
你可以为每个图形项安装一个事件过滤器,通过捕获特定的事件(如鼠标事件或键盘事件)来判断哪个图形项当前被用户交互。 -
使用焦点代理:
如果你确实需要焦点管理,可以在场景外部使用一个代理控件来管理焦点,并根据用户与图形项的交互来更新该代理控件的焦点状态。 -
自定义图形项:
通过继承QGraphicsItem并添加焦点相关的逻辑,你可以自定义图形项以支持焦点管理。
下面是一个简单的示例,展示如何为 QGraphicsItem 添加事件过滤器来检测鼠标点击,从而判断哪个图形项被“选中”:
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QMouseEvent>
#include <QDebug>
class CustomRectItem : public QGraphicsRectItem
{
public:
CustomRectItem(QGraphicsItem* parent = nullptr)
: QGraphicsRectItem(parent)
{
setAcceptHoverEvents(true);
}
protected:
void mousePressEvent(QGraphicsSceneMouseEvent* event) override
{
qDebug() << "Mouse pressed on item" << this;
QGraphicsItem::mousePressEvent(event);
}
void hoverMoveEvent(QGraphicsSceneHoverEvent* event) override
{
qDebug() << "Hovering over item" << this;
QGraphicsItem::hoverMoveEvent(event);
}
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QGraphicsScene scene;
QGraphicsView view(&scene);
CustomRectItem* item1 = new CustomRectItem();
item1->setRect(0, 0, 100, 100);
item1->setBrush(Qt::red);
CustomRectItem* item2 = new CustomRectItem();
item2->setRect(100, 100, 100, 100);
item2->setBrush(Qt::blue);
scene.addItem(item1);
scene.addItem(item2);
view.show();
return app.exec();
}

在这个示例中,我们创建了一个自定义的 QGraphicsRectItem 类,并重写了 mousePressEvent 和 hoverMoveEvent 方法来检测鼠标事件。每当鼠标点击或悬停在某个图形项上时,都会打印出相应的调试信息。
虽然这不是直接的“焦点”管理,但它提供了一种方式来追踪用户与场景中图形项的交互。如果你需要更复杂的焦点管理逻辑,可能需要进一步自定义图形项或结合使用其他 Qt 机制。
3267

被折叠的 条评论
为什么被折叠?



