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

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

Qtで作ってみた・・アナログ時計 Timerと描画更新(QPainter編)

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

こんにちは。川上です。

1秒タイマーで、デジタル時計と時分秒針画像の描画更新が要りますwな。

1秒タイマーの設定と描画更新の仕組みは、これまた、巷からあちこちで教示されてました。

どうやら、1秒タイマーと描画更新処理は、システム内蔵のライフサイクルの

void MainWindow::paintEvent(QPaintEvent *event)

でくっ付けるみたいでした。

ーー mainwindow.cpp ーー

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()) は、オーバーライドは不要みたいでした。

ではでは。

    上に戻る