フレーム付きのQGraphicsTextItemのQPropertyAnimationは、テキストを不安定にします

千鳥

QGraphicsTextItemフレームを追加しことをアニメートしています。アニメーション中、テキストがフレーム内でわずかに揺れているように見えますが、これは非常に煩わしいことです。

サンプルコード:

class MovingFrameText : public QGraphicsTextItem
{
    Q_OBJECT;

   public:
      MovingFrameText( ) : QGraphicsTextItem(0)
      {
         setPlainText ( "human ");
         QFont f =  font();
         f.setPixelSize(40);
         setFont(f);
         setFlags(QGraphicsItem::ItemIsMovable);
      }

      QRectF boundingRect() const
      {
         return QGraphicsTextItem::boundingRect().adjusted(-2,-2,+2,+2);
      }

      void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget)
      {
         QGraphicsTextItem::paint(painter,option,widget);
         painter->setPen(Qt::black);
         painter->drawRect(boundingRect());
      }

};

int main(int argc, char *argv[])
{
   QApplication app(argc,argv);


   MovingFrameText t;
   t.setPos(640,680);

   QGraphicsScene scene;
   scene.addItem(&t);

   QGraphicsView view(&scene);
   view.resize(640, 680);
   view.show();

    auto moveAnimation = new QPropertyAnimation( &t,  "pos" );
    moveAnimation->setDuration( 10000 );
    moveAnimation->setStartValue( QPointF(640, 680) );
    moveAnimation->setEndValue(  QPointF(0, 0) );
    moveAnimation->setEasingCurve( QEasingCurve::Linear );
    moveAnimation->start(QAbstractAnimation::DeleteWhenStopped);

 return app.exec();
}

アニメーションをスムーズにする方法はありますか?

scopchanov

解決

次の方法でアニメーションを大幅に改善できます。

  1. QVariantAnimation代わりに使用し、各反復QPropertyAnimationを呼び出すQGraphicsItem::update
  2. すべてのペイント操作でキャンバスとしての追加QPainter使用してペイントをバッファリングQPixmapし、paintメソッドに渡されたペインターを使用してキャンバスをペイントします

注:QGraphicsTextItemまだ少しを振るだろうが、少なくとも、それは一つのオブジェクトの代わりに、いくつかの独立したものとして動作します。

提案されたソリューションを実装するためにコードを変更する方法について、私が用意した例を次に示します。

class MovingFrameText : public QGraphicsTextItem
{
public:
    MovingFrameText(const QString &text, QGraphicsItem *parent = nullptr)
        : QGraphicsTextItem(parent)
    {
        QFont f(font());

        f.setPixelSize(40);

        setFont(f);
        setPlainText(text);
    }

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
        painter->setClipping(true);
        painter->setClipRect(option->rect);
        painter->setRenderHint(QPainter::SmoothPixmapTransform);

        QPixmap canvas(option->rect.size());
        QPainter canvasPainter;

        canvas.fill(Qt::transparent);

        canvasPainter.begin(&canvas);

        canvasPainter.setFont(font());
        canvasPainter.drawRect(option->rect.adjusted(0, 0, -1, -1));
        canvasPainter.drawText(option->rect, toPlainText());

        painter->drawPixmap(0, 0, canvas);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);

    QGraphicsView view;
    auto *t = new MovingFrameText("human");

    view.setScene(new QGraphicsScene(&view));
    view.setAlignment(Qt::AlignLeft | Qt::AlignTop);
    view.setSceneRect(0, 0, 640, 680);
    view.scene()->addItem(t);
    view.show();

    auto *moveAnimation = new QVariantAnimation();

    moveAnimation->setDuration(10000);
    moveAnimation->setStartValue(QPointF(640, 680));
    moveAnimation->setEndValue(QPointF(0, 0));
    moveAnimation->start(QAbstractAnimation::DeleteWhenStopped);

    QObject::connect(moveAnimation, &QVariantAnimation::valueChanged, [t](const QVariant &value){
        t->setPos(value.toPointF());
        t->update();
    });

    return app.exec();
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

仮想リスト内のリアクティブフォームは不安定に動作します

分類Dev

16.04へのアップグレードに失敗しました。システムは不安定なリポジトリを言います。更新中に重複パッケージメッセージを取得する

分類Dev

テスト用の不安定なファイルシステムを作成できません

分類Dev

セレンを使用して、フォームコントロール付きのボックスにテキストを入力します

分類Dev

並列テストを使用してすべてのテストを一度に実行すると、テキストフィールドの入力が不安定になります

分類Dev

並列テストを使用してすべてのテストを一度に実行すると、テキストフィールドの入力が不安定になります

分類Dev

tkinterを使用してPythonの色付きフレームにテキストエントリを配置するにはどうすればよいですか?

分類Dev

サイプレスの不安定なテストでcy.wait()の代替を探しています

分類Dev

リフレクションはHashCodeを不安定にします

分類Dev

Debianのピン留め-安定版を使用しますが、必要に応じてテスト/不安定版からインストールします| また、可能な場合は、安定したバックポートからdepsをインストールします

分類Dev

日付付きのリストをRのデータフレームに変換します

分類Dev

InDesignはテキストフレームのサイズを変更します

分類Dev

djangoはコンテキスト付きの別のビューにリダイレクトします

分類Dev

Scalaデータフレームの列の文字列から条件付きでテキストを削除するにはどうすればよいですか?

分類Dev

Ookla の速度テストでシングル スレッド接続またはマルチスレッド接続を選択するときに、接続の速度が不安定かどうかが問題になるのはなぜですか?

分類Dev

BowerはAngularの不安定なリリース(1.4.0-rc.0)をインストールします

分類Dev

不安定ではなく安定のためにDebianソースファイルをダウンロードする

分類Dev

不安定ではなく安定のためにDebianソースファイルをダウンロードする

分類Dev

テキストを選択しようとすると、Android UIが不安定に動作するのはなぜですか?

分類Dev

日時のテキスト入力をDjangoフォームのカレンダー日付ピッカーアイコンに置き換えます

分類Dev

aptは「不安定なCLIインターフェイス」の警告を出します

分類Dev

Emit操作は、フィールドをインクリメントするためのランタイムを不安定にする可能性があります

分類Dev

Laravelフォームを介してコンマ付きの入力テキストを渡す方法は?

分類Dev

データフレームのリストから名前付きテーブルを作成します

分類Dev

Win7 + Ubuntuのデュアルブートによる不安定性-VirtualBoxはより安定しますか?

分類Dev

Pythonはラベル付きの文字列のリストでデータフレームを変換します

分類Dev

フォーム要素をフレックスボックスユニットの下部に配置しますが、テキストは上部に保持します

分類Dev

リスト付きのJSONdictをデータフレームにインポートします

分類Dev

SwiftはUITextViewのテキストを属性付きのファイルに保存します

Related 関連記事

  1. 1

    仮想リスト内のリアクティブフォームは不安定に動作します

  2. 2

    16.04へのアップグレードに失敗しました。システムは不安定なリポジトリを言います。更新中に重複パッケージメッセージを取得する

  3. 3

    テスト用の不安定なファイルシステムを作成できません

  4. 4

    セレンを使用して、フォームコントロール付きのボックスにテキストを入力します

  5. 5

    並列テストを使用してすべてのテストを一度に実行すると、テキストフィールドの入力が不安定になります

  6. 6

    並列テストを使用してすべてのテストを一度に実行すると、テキストフィールドの入力が不安定になります

  7. 7

    tkinterを使用してPythonの色付きフレームにテキストエントリを配置するにはどうすればよいですか?

  8. 8

    サイプレスの不安定なテストでcy.wait()の代替を探しています

  9. 9

    リフレクションはHashCodeを不安定にします

  10. 10

    Debianのピン留め-安定版を使用しますが、必要に応じてテスト/不安定版からインストールします| また、可能な場合は、安定したバックポートからdepsをインストールします

  11. 11

    日付付きのリストをRのデータフレームに変換します

  12. 12

    InDesignはテキストフレームのサイズを変更します

  13. 13

    djangoはコンテキスト付きの別のビューにリダイレクトします

  14. 14

    Scalaデータフレームの列の文字列から条件付きでテキストを削除するにはどうすればよいですか?

  15. 15

    Ookla の速度テストでシングル スレッド接続またはマルチスレッド接続を選択するときに、接続の速度が不安定かどうかが問題になるのはなぜですか?

  16. 16

    BowerはAngularの不安定なリリース(1.4.0-rc.0)をインストールします

  17. 17

    不安定ではなく安定のためにDebianソースファイルをダウンロードする

  18. 18

    不安定ではなく安定のためにDebianソースファイルをダウンロードする

  19. 19

    テキストを選択しようとすると、Android UIが不安定に動作するのはなぜですか?

  20. 20

    日時のテキスト入力をDjangoフォームのカレンダー日付ピッカーアイコンに置き換えます

  21. 21

    aptは「不安定なCLIインターフェイス」の警告を出します

  22. 22

    Emit操作は、フィールドをインクリメントするためのランタイムを不安定にする可能性があります

  23. 23

    Laravelフォームを介してコンマ付きの入力テキストを渡す方法は?

  24. 24

    データフレームのリストから名前付きテーブルを作成します

  25. 25

    Win7 + Ubuntuのデュアルブートによる不安定性-VirtualBoxはより安定しますか?

  26. 26

    Pythonはラベル付きの文字列のリストでデータフレームを変換します

  27. 27

    フォーム要素をフレックスボックスユニットの下部に配置しますが、テキストは上部に保持します

  28. 28

    リスト付きのJSONdictをデータフレームにインポートします

  29. 29

    SwiftはUITextViewのテキストを属性付きのファイルに保存します

ホットタグ

アーカイブ