1

私はをサブクラス化QLabelしており、ユーザーがマウスで画像をドラッグ(または回転)するときに回転させようとしています。現在、私はすべてのマウス移動イベントで時計回りに回転しています。

void RotoTest::slotMouseMoved()
{
    currentRotation += 1;
    rotate(currentRotation % 360);
}

void RotoTest::rotate(int degree)
{
    QPixmap pixmap(originalPixmap);
    QPixmap rotatedMap(pixmap.size());
    QPainter p(&rotatedMap);
    p.translate(pixmap.size().width() / 2, pixmap.size().height() / 2);
    p.rotate(degree);
    p.translate(-pixmap.size().width() / 2, -pixmap.size().height() / 2);
    p.drawPixmap(0, 0, pixmap);
    this->setPixmap(rotatedMap);
}

これは機能して回転しますが、問題は、画像が非常に遅く、ぎくしゃくし、反応しなくなることです。特に、特定のインスタンスでマウスをすばやくまたは長く動かすことができます。これは、マウスを動かすと大量の信号が送信されるためだと思います。スムーズな回転を実現する方法について何か提案はありますか?私は、画像が回転するのと同じくらいうまく回転することを探してQDialいます。

4

2 に答える 2

0

コードを追加しないとわかりませんが、イベントが多すぎる可能性があります。その場合、1)Qtは多くの同一のイベントをいくつかに静かに圧縮することになっているので、驚きです。2)入力イベントを処理するスロットコードでupdate()の呼び出しを調整することで、自分でそれを行うことができます。 。(または、QLabelをサブクラス化しているので、どこかに行きます...?)

説明とコードについては、http: //qt-project.org/forums/viewthread/12257を参照してください。

繰り返しになりますが、これは間違ったツリーを完全に吠えている可能性があります。そのため、反対票ボタンがあります;)

于 2012-09-11T04:39:15.283 に答える
0

問題は、内でピックスマップにペイントするなどの高価な操作のみを実行する必要があることですpaintEvent()。次のslotMouseMoved()ようになります。

void slotMouseMoved() {
     currentRotation = (currentRotation + 1) % 360;
     update();
}

ピックスマップの生成は、再実装された内で実行する必要がありますpaintEvent()。QLabelから派生する理由はなく、単にQWidgetから派生します。

void RotoTest::paintEvent(QPaintEvent * ev)
{
    QPixmap pixmap(originalPixmap);
    QPainter p(this);
    p.translate(pixmap.size().width() / 2, pixmap.size().height() / 2);
    p.rotate(degree);
    p.translate(-pixmap.size().width() / 2, -pixmap.size().height() / 2);
    p.drawPixmap(0, 0, pixmap);
}
于 2013-09-10T16:09:12.233 に答える