使用QGraphicsScene

时间:2015-05-22 08:25:51

标签: c++ qt qgraphicsscene qgraphicstextitem

我有一个QT项目(使用C ++),其中某个用户定义的QGraphicsItem的实例称为Person在场景中移动。有时候那些Persons会相互作用,以便其中一些会改变颜色。

现在我想在窗口中放置一个文本字段,并显示每种颜色的数量。但由于更改发生在对Person::advance - 方法的调用中,我想创建一个可以在这些内容中更新的文本字段。

我可以通过将以下代码添加到main.cpp来轻松显示一些文本:

    QGraphicsSimpleTextItem *text1 = new QGraphicsSimpleTextItem;
    text1->setPos(-200, -150);
    text1->setText("This is an arbitrary English sentence");
    scene.addItem(text1);

但我不知道如何从我场景中text1的{​​{1}} - 方法中访问和更改此变量advance的文本。对此有什么好的策略?

  

我是否应该创建一个跟踪计数的全局变量,如果我这样做,我该如何更新文本字段?或者文本甚至不应该在我的Persons上,而是在其他更适合的地方定义,它可以在程序的任何地方调用?是否有通用的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以继承QGraphicsObject而不是QGraphicsItem,这样您就可以使用Person类中的信号。然后只是向一个插槽发出信号,该插槽对项目进行计数并更改text1的文本。

我要做的是将图形视图移动到新的QWidget类型类(如QMainWindow)。这是为了更容易处理信号和插槽,它还允许您使用成员变量。它也比在main.cpp中做所有事情更清晰。

您可以将text1变量作为此MainWindow类的成员变量。这样可以轻松访问它。

MainWindow课程中的插槽可能如下所示:

MainWindow::countItems()
{
    int redcount = 0;
    int greencount = 0;
    int bluecount = 0;
    // iterate through your `Person` items and check their colors and count them
    text1->setText(QString("Red items: %1, Green items: %2, Blue items: %3").arg(redcount).arg(greencount).arg(bluecount));
}

你可以改进逻辑,但这只是一个基本的例子。