文本字段保持跟踪计数在QT使用QGraphicsScene

Text field keeping track of count in QT using QGraphicsScene

本文关键字:QT 使用 QGraphicsScene 字段 跟踪 文本      更新时间:2023-10-16

我有一个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的文本从Personsadvance -方法在我的场景。什么是好的策略呢?

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

您可以子类化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));
}

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