【发布时间】:2020-11-04 02:05:39
【问题描述】:
我有一个包含项目的 QGraphicsScene(我们称之为母场景),其中一些还包含 QGraphicsScene(我们称它们为子场景)。
观察:女儿场景和母亲场景中的选择互不打扰。这意味着,如果我在母场景中选择一个项目,我可以选择子场景中的项目,而母场景中的项目将保持选中状态。
我的预期结果:我希望我在一个场景中的选择清除任何其他场景中的选择。
[为清晰而编辑]当我在一个场景中选择一个项目时,我想取消选择其他场景中的选定项目,而不是在不同的场景中有多个焦点。
我的动机:我想这样做是因为当我使用键盘快捷键时,我不知道 Qt 会选择哪个场景。当我只有一个女儿时,选择母亲(我更喜欢女儿)。
到目前为止我的解决方案: 在子场景容器项中,mousePressEvent 清除了母场景的选择。我发现这个解决方案非常丑陋,我想知道是否有人知道一个更好的解决方案,它会使用一些内部 Qt 功能。现在看来,这是一个糟糕的 DIY 解决方案,会带来很多问题。
提前致谢!
[编辑:最小示例] 在这个例子中,我们可以同时选择两个嵌套元素。我宁愿在整个场景中一次只选择一个。
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QMainWindow>
#include <QGraphicsItem>
#include <QGraphicsLinearLayout>
#include <QGraphicsWidget>
#include <QGraphicsProxyWidget>
// Item that gets red contour when selected
class SimpleItem : public QGraphicsItem
{
public :
SimpleItem():QGraphicsItem()
{
setFlag(QGraphicsItem::ItemIsSelectable, true);
}
QRectF boundingRect() const override { return QRectF(-20, -20, 40, 40);}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override
{
painter->setPen(Qt::black);
if(isSelected())
painter->setPen(Qt::red);
painter->setBrush(Qt::gray);
painter->drawRect(boundingRect());
}
};
// Item that contains a QGraphicsScene in a layout
// This item gets also a red contour when selected
class SceneItem : public QGraphicsWidget
{
public :
SceneItem():QGraphicsWidget()
{
setFlag(QGraphicsItem::ItemIsSelectable, true);
setFocusPolicy(Qt::ClickFocus);
// Create the inner scene
QGraphicsLinearLayout * layout = new QGraphicsLinearLayout;
setLayout(layout);
QGraphicsScene * scene = new QGraphicsScene;
QGraphicsView * view = new QGraphicsView(scene);
QGraphicsProxyWidget * proxy = new QGraphicsProxyWidget;
layout->addItem(proxy);
proxy->setWidget(view);
// Add a simple item
SimpleItem * simpleItem = new SimpleItem;
scene->addItem(simpleItem);
}
QRectF boundingRect() const override { return QRectF(0, 0, 100, 100);}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override
{
painter->setPen(Qt::black);
if(isSelected())
painter->setPen(Qt::red);
painter->setBrush(Qt::lightGray);
painter->drawRect(boundingRect());
}
};
// Main
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow w;
QGraphicsScene * scene = new QGraphicsScene;
QGraphicsView * view = new QGraphicsView(scene);
view->setDragMode(QGraphicsView::RubberBandDrag);
w.setCentralWidget(view);
SceneItem * item = new SceneItem;
scene->addItem(item);
w.show();
return a.exec();
}
【问题讨论】:
-
这似乎是一个 XY 问题。为什么要嵌套场景?
-
我很确定这不是 XY 问题。我嵌套场景是因为我希望一些项目包含图形场景,这就是我的用例。
-
我嵌套场景是因为我希望一些项目包含图形场景这从您的帖子中显而易见。如果
QGraphicsScene的预期用途是,那就是另一回事了。无论如何,如果没有Minimal, Reproducible Example,就很难理解您的问题。寻找解决方案。 -
感谢您查看我的问题。这是一个代码示例。
-
请看this,从Graphics View 支持嵌入QWidgets 到Graphics View 高性能的关键在于减少绘制量每一帧。 QGraphicsWidget 和 QGraphicsProxyWidget 一起是巨大的性能杀手,因为它们不能以有效的方式呈现。
标签: c++ qt nested selection qgraphicsscene