Qtで作ってみた・・アナログ時計 Timerと描画更新(QPainter編)
こんにちは。川上です。
1秒タイマーで、デジタル時計と時分秒針画像の描画更新が要りますwな。
1秒タイマーの設定と描画更新の仕組みは、これまた、巷からあちこちで教示されてました。
どうやら、1秒タイマーと描画更新処理は、システム内蔵のライフサイクルの
void MainWindow::paintEvent(QPaintEvent *event)
でくっ付けるみたいでした。
ーー 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 | MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //-- 1000msec timer --- auto timer = new QTimer(this); timer->setInterval(1000); connect(timer,SIGNAL(timeout()),SLOT(update())); timer->start(); // --- Clock set -- 画像取得 makeClockBaseSetting(); } void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(this); // -- 背景画像の表示(数文字+デジタル時計付き) drawPaintClock(&painter); } void MainWindow::drawPaintClock(QPainter *painter) { ・・・ // --- 時計版文字位置用の半径Size int hankei = bsWorH / 2 - 40; // MARK: -- 時計盤の数文字表示 drawPaintMoji(painter, hankei); ・・・ } void MainWindow::drawPaintMoji(QPainter *painter,int hankei) { double pi = 3.141592653589793; int lblwh= 20; // -- センター位置の画像表示 QSize sz = this->frameSize(); int bsWorH = (sz.width() > sz.height() ? sz.height() : sz.width() - 40); QRect rect((sz.width() - bsWorH) / 2 , (sz.height() - bsWorH) / 2 , bsWorH, bsWorH); QPointF bs_center = QPointF(sz.width() / 2 - (lblwh+lblwh/2) , sz.height()/2 - (lblwh+lblwh/2)); for (int ps=1;ps<=12;ps++) { double qq = pi / double(180) * double(getKakuDo(ps) - 90 ); double x = double(hankei) * cos(qq); double y = double(hankei) * sin(qq); float lbl_x = float(bs_center.rx()) + float(x); float lbl_y = float(bs_center.ry()) + float(y); QRect text_rect(lbl_x , lbl_y , lblwh*2, lblwh*2); painter->setPen(Qt::blue); painter->setFont(QFont("メイリオ", lblwh)); painter->drawText(text_rect, (Qt::AlignCenter),QString::number(ps)); } } |
connect(timer,SIGNAL(timeout()),SLOT(update()));
の SLOT(update()) は、オーバーライドは不要みたいでした。
ではでは。