Qtで作ってみた・・アナログ時計 時分秒針画像の回転描画(QPainter編)🍻
こんにちは。川上です。
Qt上での回転処理で結構、ドボってましたw。
で、画像回転処理How-toに、それなりの、しきたりなるもんがあったみたりで。
ホンマかようわかりませんけど、なんとなくでけたので( ^ ^ )/■です。
し・き・た・りのMy備忘録(ウソかもね。。)
・ QPainterは、いっぺんに複数以上の画像描画処理を連続しちゃいけない。
・ QPainterは1枚処理終了後に、次処理にワタルべき
・ 回転処理の順序の鉄板しきたり
・ 表示指定位置処理 → 回転処理
ーー mainwindow.cpp ーー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | 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){ ・・・ 以下同文 } |
でした。
諸々の微調整(文字位置など)は、追々で。