0

QGraphicsPixmapItem によって継承される独自のクラスに Q_PROPERTY マクロを設定したいという問題があります。したがって、位置を設定する最初のプロパティは非常にうまく機能しますが、Qt::YAxis の回転を設定する 2 番目のプロパティは機能せず、正しく記述する方法がわかりません。アニメーションにはこのプロパティが必要です。これが私がしようとしているものです:

--ああ--

class myOwnPixmapItem : public QObject, public QGraphicsPixmapItem
{
    Q_OBJECT
    Q_PROPERTY (QPointF pos READ pos WRITE setPos)
    Q_PROPERTY (QTransform rot READ rot WRITE setRotation)

public:
    flowNpixmapItem()
};

--A.cpp--

myItemPosAnim -> setTargetObject (myItem);
myItemTransAnim -> setTargetObject (myItem);

myItemPosAnim -> setStartValue (QPointF (cover0 -> pos()));
myItemTransAnim -> setStartValue (QTransform::rotate (0, Qt::YAxis));
4

1 に答える 1

1

問題は、それQTransform::rotateが非静的メンバー関数であることです。つまり、この構文は関数を参照するためにのみ使用でき (関数ポインター)、関数を呼び出すためには使用できません。

メソッドQPropertyAnimation::setStartValueは引数として値(関数ではない)を取るため、あなたの場合は QTransform 値です。QTransform::rotate(...)(引数付き) は値ではありません。実際、指定された引数で静的メソッドを呼び出す必要があるとコンパイラが判断するため、コンパイルできません。

したがって、おそらくこれが必要です:

myItemPosAnim -> setTargetObject (myItem);
myItemTransAnim -> setTargetObject (myItem);

myItemPosAnim -> setStartValue (QPointF (cover0 -> pos()));
QTransform transform;
transform.rotate (0, Qt::YAxis):
myItemTransAnim -> setStartValue (transform);

しかし、あなたのコードにはまだ大きな問題があります。回転自体ではなく、変換をアニメーション化します。回転変換は非線形です。つまり、0° から 180° への変換をアニメートしようとすると、必要な結果が得られません。180° の回転は、係数 -1 で座標系をスケーリングすることと同じであるため、スケーリング アニメーションを取得することをお勧めします。これは、スケーリング線形変換であり、QPropertyAnimation が開始値と終了値の間を補間するため、「開始値と終了値の中間」が を使用して計算されるためです。これは、回転行列に必要なもの0.5 * start + 0.5 * endではありません。

qrealとにかくQGraphicsItems の回転はタイプなので、このタイプを使用してください:

Q_PROPERTY (double rot READ rot WRITE setRotation)

次に、これを次のように使用する必要があります。

myItemPosAnim -> setTargetObject (myItem);
myItemTransAnim -> setTargetObject (myItem);

myItemPosAnim -> setStartValue (QPointF (cover0 -> pos()));
myItemTransAnim -> setStartValue (0.0);
于 2012-07-29T15:30:46.820 に答える