2

QLabel Widge 内で 89x89 の画像を回転させようとしています。

#include "header.h"

disc::disc(QWidget *Parent) : QWidget(Parent)
{
    orig_pixmap = new QPixmap();
    rotate = new QLabel(this);
    showDegrees = new QLabel(this);

    orig_pixmap->load("pic.png");
    degrees = 0;

    rotate->resize(89,89);
    rotate->move(100,10);
    rotate->setStyleSheet("QLabel{background-color:red;}");

    showDegrees->resize(100,100);
    showDegrees->move(400,0);
}

void disc::rotate_disc()
{
    QString string;
    degrees++;
    if(degrees == 360) degrees = 0;

    QTransform rotate_disc;

    rotate_disc.translate( (orig_pixmap->width()-rotate->width())/2 , (orig_pixmap->width()-rotate->height())/2);
    rotate_disc.rotate(degrees,Qt::ZAxis);

    QPixmap pixmap;
    //pixmap = orig_disc->scaled(89,89,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
    pixmap = orig_pixmap->transformed(rotate_disc,Qt::SmoothTransformation);
    rotate->setPixmap(pixmap);

    string.append("Degrees: " + QString::number(degrees) + "*");
    showDegrees->setText(string);
}

回転なのに。画像の半分は QLabel の外側にロールされるため、その側は表示されません。画像の中心の原点(0,0)で中心を回転させるにはどうすればよいですか。

ここにファイルがあります

http://www65.zippyshare.com/v/85775455/file.html

それを見ると、画像が左に跳ねているように見えることがわかります。黒い領域内で回転させるにはどうすればよいですか。

私は、rotate_disc() 関数に 10ms ごとに信号タイムアウトを設定します。これを使用してQtの詳細を学習しています。

ありがとう!

4

3 に答える 3

3

こんなんやってしまった…

//Move windows's coordinate system to center.
QTransform transform_centerOfWindow( 1, 0, 0, 1, width()/2, height()/2 );

//Rotate coordinate system.
transform_centerOfWindow.rotate( m_LoadingDisk_degrees );

//Draw image with offset to center of image.
QPainter painter( this );

//Transform coordinate system.
painter.setTransform( transform_centerOfWindow );

//Load image.

//Notice: As coordinate system is set at center of window, we have to center the image also... so the minus offset to come to center of image.
painter.drawPixmap( -loadingDisk.width()/2, -loadingDisk.height()/2, loadingDisk );
于 2012-10-20T14:27:12.997 に答える
1

本当に欠けているのは、ピックスマップの中心を中心に回転するための最初の翻訳だけだと思います。

原点に移動し、回転させてから、元に戻します。また、変換は、コードで指定した方法とは逆の順序で適用されることに注意してください。

QTransform rotate_disc;
rotate_disc.translate(orig_pixmap->width()/2.0 , orig_pixmap->height()/2.0);
rotate_disc.rotate(degrees);
rotate_disc.translate(-orig_pixmap->width()/2.0 , -orig_pixmap->height()/2.0);
于 2012-05-29T08:13:29.553 に答える
0

ローディング インジケーターを作成する場合は、アニメーション gif の方がはるかに簡単です。Qt で GIF アニメーションを見る

于 2012-05-26T18:46:33.047 に答える