У меня есть 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
, а точнее определиться в каком-то другом более подходящем месте, где его можно вызывать из любой точки программы? Есть ли общий способ сделать это?
Вы могли бы подкласс 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));
}
Вы можете улучшить логику, но это только базовый пример.