QGraphicsScene的selectionChanged()事件

3

我需要知道如何在我的Scene中选择一个QGraphicItem。我正在使用来自方法selectionChange()的信号,但没有任何作用。这是我的代码:

scene.h

class Scene : public QGraphicsScene{
public:
    Scene(QGraphicsScene *scene = 0);
    ~Scene();
private slots:
    void test();
};

scene.cpp

Scene::Scene(QGraphicsScene* scene):QGraphicsScene(scene)
{
    connect(this, SIGNAL(QGraphicsScene::selectionChanged()), this, SLOT(test()));
}

void Scene::test() {
    qDebug() << "I'm here ";
}

我想问题在于我的场景继承自QGraphicScene,或者在构造函数中定义连接不是一个好主意。


您添加到场景中的项目应该设置它们的QGraphicsItem :: ItemIsSelectable标志,因此请查看setFlags - scopchanov
是的@scopchanov,我在所有项目中都设置了这个item->setFlag(QGraphicsItem::ItemIsSelectable);。 - Zharios
3
我认为你应该像这样建立连接:connect(this, SIGNAL(selectionChanged()), this, SLOT(test())); - vahancho
谢谢@vahancho,这是正确的。我在创建场景并进行测试时,在课堂上很好,但我需要连接留在Scene类中而不是外部:S。 - Zharios
1
@DavidLeonOrtega,抱歉,我不明白你的意思:) 你需要什么?请重新表述一下。 - vahancho
1
@vahancho 首先他使用了一个预设的_QGraphicsScene_测试它,然后决定对其进行子类化,在其中粘贴了原来的connect行,但没有从代码中删除已经不必要的限定符QGraphicsScene:: - scopchanov
2个回答

5

SIGNALSLOT是宏,因此基于文本处理,这使得它们非常挑剔。通常最好使用assert来确保所有连接都成功。在您的情况下,问题是多余的限定。请删除它:

connect(this, SIGNAL(selectionChanged()), this, SLOT(test()));

1
他使用新语法来检测错误并在编译时获得错误提示,这不是更好吗? - scopchanov
1
如果他们正在使用Qt5,那么可能是这样。我仍然停留在Qt4上,并且还没有研究过Qt5的细节,所以我为更好的答案留下了空间... - Angew is no longer proud of SO
好观点!我总是忘记人们使用不同的版本。 :) - scopchanov

3

正如 @Angew 所提到的那样,问题在于传递给 SIGNAL 宏的文本。

如果您使用的是 Qt 5,首选方法是使用更新的连接语法,这有助于编译时错误检查。

connect(this, &GraphicsScene::SelectionChanged, this, &Scene::Test);

这种连接方法使用函数地址,有一个额外的好处是可以连接到未被声明为SLOT的函数。然而,仍然定义槽可能是可取的,具体原因请参考这里的讨论


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接