大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

Qtで作ってみた・・アナログ時計 時分秒針画像の回転描画(QPainter編)🍻

著者:川上洋
公開日:2020/03/23
最終更新日:2020/03/23
カテゴリー:技術情報 雑記

こんにちは。川上です。

Qt上での回転処理で結構、ドボってましたw。
で、画像回転処理How-toに、それなりの、しきたりなるもんがあったみたりで。

ホンマかようわかりませんけど、なんとなくでけたので( ^ ^ )/■です。

し・き・た・りのMy備忘録(ウソかもね。。)
・ QPainterは、いっぺんに複数以上の画像描画処理を連続しちゃいけない。
・ QPainterは1枚処理終了後に、次処理にワタルべき
・ 回転処理の順序の鉄板しきたり
・ 表示指定位置処理 → 回転処理

ーー mainwindow.cpp ーー

void MainWindow::paintEvent(QPaintEvent *event)
{
	QPainter painter(this);
	
	// -- 背景画像の表示
	drawPaintClock(&painter);
	
	// -- 時分秒画像の回転処理
	QDateTime dt = QDateTime::currentDateTime();
	int hh = dt.time().hour() >= 12 ? dt.time().hour() -12:dt.time().hour() ;
	int mini = dt.time().minute();
	int sec = dt.time().second();
	
	QPainter ptrHH(this);
	drawPaintClockHH(&ptrHH,hh,mini);
	
	QPainter ptrMM(this);
	drawPaintClockMM(&ptrMM,mini);
	
	QPainter ptrSS(this);
	drawPaintClockSS(&ptrSS,sec);
}

void MainWindow::drawPaintClockHH(QPainter *ptrHH,int hh,int mini)
{
    QSize sz = this->frameSize();

    // -- Image Frameの縦横サイズ
    int bsWorH =  (sz.width() > sz.height() ? sz.height() : sz.width() - 40);

    qreal CIRCLE_RADIUS = 360;
    qreal f_HH = (hh*60+mini+1) *  (CIRCLE_RADIUS / (12*60));

    QImage qimg = s_HariImage.scaled(
                        bsWorH,
                        bsWorH,
                        Qt::KeepAspectRatio,
                        Qt::FastTransformation
                );

    QPixmap destpix =  QPixmap::fromImage(qimg);

    // --- Image位置の変更
    ptrHH->translate(0,(sz.height() - destpix.size().width()) /2);

    // ---  Image の回転
    ptrHH->translate(destpix.size().width()/2,destpix.size().height()/2);
    ptrHH->rotate(f_HH);
    ptrHH->translate(-destpix.size().width()/2,-destpix.size().height()/2);

    QRect d_rect1( 0,
                   0,
                 destpix.size().width(),destpix.size().height());

    ptrHH->drawPixmap(d_rect1, destpix);

}

void MainWindow::drawPaintClockMM(QPainter *ptrMM,int mini){
 ・・・ 以下同文
}
void MainWindow::drawPaintClockSS(QPainter *ptrSS,int sec){
 ・・・ 以下同文
}

でした。
諸々の微調整(文字位置など)は、追々で。

    上に戻る