Текстовое поле для отслеживания количества в QT с использованием QGraphicsScene

У меня есть 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 изнутри advanceметод Persons в моей сцене. Какова хорошая стратегия для этого?

Должен ли я создать глобальную переменную, отслеживающую счет, и если я это сделаю, как я могу затем обновить текстовое поле? Или даже текст не должен быть на моем QGraphicsScene, а точнее определиться в каком-то другом более подходящем месте, где его можно вызывать из любой точки программы? Есть ли общий способ сделать это?

0

Решение

Вы могли бы подкласс 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));
}

Вы можете улучшить логику, но это только базовый пример.

1

Другие решения


По вопросам рекламы [email protected]