0

我有一个 QT 项目(使用 C++),其中某个用户定义的QGraphicsItem调用实例Person在场景中移动。有时它们Persons会相互作用,因此其中一些会改变颜色。

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

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

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

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

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

4

1 回答 1

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));
}

您可以改进逻辑,但这只是一个基本示例。

于 2015-05-22T08:53:37.357 回答