0

特定のユーザー定義のインスタンスがシーン内QGraphicsItemPerson移動する QT プロジェクト (C++ を使用) があります。それら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-method内からこの変数のテキストにアクセスして変更する方法がわかりません。Personsこれにはどのような戦略が適していますか?

カウントを追跡するグローバル変数を作成する必要がありますか?作成した場合、テキスト フィールドを更新するにはどうすればよいですか? または、テキストを myQGraphicsSceneに置くのではなく、プログラムのどこからでも呼び出すことができる他のより適切な場所で定義する必要がありますか? これを行う一般的な方法はありますか?

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 に答える