打印
[程序源码]

基于QT矩阵时钟设计

[复制链接]
804|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 一路向北lm 于 2023-6-15 21:54 编辑

第一步:规划网格
使用qt的paintEvent函数绘制8*31网格,网格的起始点坐标为(30,30),长775,宽200,每一个方格的长度为25。
quint16 start_pos_x = 30;
quint16 start_pos_y = 30;
quint16 len_x = 775;
quint16 len_y = 200;
quint16 stop_pos_x = start_pos_x + len_x;
quint16 stop_pos_y = start_pos_y + len_y;
quint16 offset = 25;
void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);  //实例画家对象
    painter.drawRect(QRect(start_pos_x,start_pos_y,len_x,len_y));  //画矩形
    //绘制水平均分线
    for(quint8 i=1;i<8;i++)
    {
      painter.drawLine(QPoint(start_pos_x,start_pos_y+offset*i),QPoint(stop_pos_x,start_pos_y+offset*i));
    }
    //绘制垂直均分线
    for(quint8 i=1;i<31;i++)
    {
      painter.drawLine(QPoint(start_pos_x+offset*i,start_pos_y),QPoint(start_pos_x+offset*i,stop_pos_y));
}
}
运行效果如下:
第二步:在规划的网格上显示数字
DrawCode函数用来在规划的网格上显示数字,p为绘画师指针,cnt为6个网格的,quint8 num。
void MainWindow::DrawBrush(QPainter *p,quint8 hs,quint8 ls)
{
    p->drawRect(QRect(30 + 25*(ls-1),30 + 25*(hs-1),25,25));
}

void MainWindow::DrawCode(QPainter *p,quint8 cnt,quint8 num)
{
    quint8 index = 5;
    quint8 offset = 0;
    switch(cnt)
    {
        case 1:  offset = (cnt -1)*index; break;
        case 2:  offset = (cnt -1)*index-1; break;
        case 3:  offset = (cnt -1)*index+1; break;
        case 4:  offset = (cnt -1)*index; break;
        case 5:  offset = (cnt -1)*index+2; break;
        case 6:  offset = (cnt -1)*index+1; break;
    }
    switch(num)
    {
        case 0:
                // 2-2 2-3 2-4
                DrawBrush(p,2,2+offset);
                DrawBrush(p,2,3+offset);
                DrawBrush(p,2,4+offset);

                // 3-2 3-4
                DrawBrush(p,3,2+offset);
                DrawBrush(p,3,4+offset);

                // 4-2 4-4
                DrawBrush(p,4,2+offset);
                DrawBrush(p,4,4+offset);

                // 5-2 5-4
                DrawBrush(p,5,2+offset);
                DrawBrush(p,5,4+offset);
                // 6-2 6-3 6-4
                DrawBrush(p,6,2+offset);
                DrawBrush(p,6,3+offset);
                DrawBrush(p,6,4+offset);

        break;
      case 1:
                // 2-2 2-3
                DrawBrush(p,2,2+offset);
                DrawBrush(p,2,3+offset);
                // 3-3 4-3  5-3
                DrawBrush(p,3,3+offset);
                DrawBrush(p,4,3+offset);
                DrawBrush(p,5,3+offset);
                // 6-2 6-3 6-4
                DrawBrush(p,6,2+offset);
                DrawBrush(p,6,3+offset);
                DrawBrush(p,6,4+offset);
      break;
      case 2:
                // 2-2 2-3 2-4
                DrawBrush(p,2,2+offset);
                DrawBrush(p,2,3+offset);
                DrawBrush(p,2,4+offset);

                // 3-2 3-4
               // DrawBrush(p,3,2+offset);
                DrawBrush(p,3,4+offset);

                // 4-2 4-3 4-4
                DrawBrush(p,4,2+offset);
                DrawBrush(p,4,3+offset);
                DrawBrush(p,4,4+offset);

                //5-2
                DrawBrush(p,5,2+offset);

                // 6-2 6-3 6-4
                DrawBrush(p,6,2+offset);
                DrawBrush(p,6,3+offset);
                DrawBrush(p,6,4+offset);
      break;
      case 3:
              // 2-2 2-3 2-4
              DrawBrush(p,2,2+offset);
              DrawBrush(p,2,3+offset);
              DrawBrush(p,2,4+offset);

              // 3-4
              DrawBrush(p,3,4+offset);

              // 4-2 4-3 4-4
              DrawBrush(p,4,2+offset);
              DrawBrush(p,4,3+offset);
              DrawBrush(p,4,4+offset);

              //5-4
              DrawBrush(p,5,4+offset);

              // 6-2 6-3 6-4
              DrawBrush(p,6,2+offset);
              DrawBrush(p,6,3+offset);
              DrawBrush(p,6,4+offset);
      break;
        case 4:
                // 2-2 2-4
                DrawBrush(p,2,2+offset);
                DrawBrush(p,2,4+offset);

                // 3-2 3-4
                DrawBrush(p,3,2+offset);
                DrawBrush(p,3,4+offset);

                // 4-2 4-4
                DrawBrush(p,4,2+offset);
                DrawBrush(p,4,3+offset);
                DrawBrush(p,4,4+offset);

                // 5-2 5-3 5-4
                DrawBrush(p,5,4+offset);
                // 6-4
                DrawBrush(p,6,4+offset);
        break;
        case 5:
                // 2-2 2-3 2-4
                DrawBrush(p,2,2+offset);
                DrawBrush(p,2,3+offset);
                DrawBrush(p,2,4+offset);

                // 3-2
                DrawBrush(p,3,2+offset);

                // 4-2 4-3 4-4
                DrawBrush(p,4,2+offset);
                DrawBrush(p,4,3+offset);
                DrawBrush(p,4,4+offset);

                // 5-4
                DrawBrush(p,5,4+offset);

                // 6-2 6-3 6-4
                DrawBrush(p,6,2+offset);
                DrawBrush(p,6,3+offset);
                DrawBrush(p,6,4+offset);

        break;
    case 6:
            // 2-2 2-3 2-4
            DrawBrush(p,2,2+offset);
            DrawBrush(p,2,3+offset);
            DrawBrush(p,2,4+offset);

            // 3-2
            DrawBrush(p,3,2+offset);

            // 4-2 4-3 4-4
            DrawBrush(p,4,2+offset);
            DrawBrush(p,4,3+offset);
            DrawBrush(p,4,4+offset);

            // 5-2 5-4
            DrawBrush(p,5,2+offset);
            DrawBrush(p,5,4+offset);
            // 6-2 6-3 6-4
            DrawBrush(p,6,2+offset);
            DrawBrush(p,6,3+offset);
            DrawBrush(p,6,4+offset);

    break;
    case 7:
            // 2-2 2-3 2-4
            DrawBrush(p,2,2+offset);
            DrawBrush(p,2,3+offset);
            DrawBrush(p,2,4+offset);

            // 3-4
            DrawBrush(p,3,4+offset);

            // 4-4
            DrawBrush(p,4,4+offset);

            // 5-4
            DrawBrush(p,5,4+offset);
            // 6-4
            DrawBrush(p,6,4+offset);

    break;
    case 8:
            // 2-2 2-3 2-4
            DrawBrush(p,2,2+offset);
            DrawBrush(p,2,3+offset);
            DrawBrush(p,2,4+offset);

            // 3-2 3-4
            DrawBrush(p,3,2+offset);
            DrawBrush(p,3,4+offset);

            // 4-2 4-3 4-4
            DrawBrush(p,4,2+offset);
            DrawBrush(p,4,3+offset);
            DrawBrush(p,4,4+offset);

            // 5-2 5-4
            DrawBrush(p,5,2+offset);
            DrawBrush(p,5,4+offset);
            // 6-2 6-3 6-4
            DrawBrush(p,6,2+offset);
            DrawBrush(p,6,3+offset);
            DrawBrush(p,6,4+offset);

    break;
    case 9:
            // 2-2 2-3 2-4
            DrawBrush(p,2,2+offset);
            DrawBrush(p,2,3+offset);
            DrawBrush(p,2,4+offset);

            // 3-2 3-4
            DrawBrush(p,3,2+offset);
            DrawBrush(p,3,4+offset);

            // 4-2 4-3 4-4
            DrawBrush(p,4,2+offset);
            DrawBrush(p,4,3+offset);
            DrawBrush(p,4,4+offset);

            // 5-4
            DrawBrush(p,5,4+offset);
            // 6-2 6-3 6-4
            DrawBrush(p,6,2+offset);
            DrawBrush(p,6,3+offset);
            DrawBrush(p,6,4+offset);

    break;

    }
}
第三步:获取时间,并在规划的网格中显示出来
void  MainWindow::DisplayTime(QPainter *painter)
{
    QTime time = QTime::currentTime();
    QString timeStr = time.toString("hh:mm:ss");

    DrawCode(painter,1,timeStr.mid(0,2).toInt()/10);
    DrawCode(painter,2,timeStr.mid(0,2).toInt()%10);

    DrawCode(painter,3,timeStr.mid(3,2).toInt()/10);
    DrawCode(painter,4,timeStr.mid(3,2).toInt()%10);

    DrawCode(painter,5,timeStr.mid(6,2).toInt()/10);
    DrawCode(painter,6,timeStr.mid(6,2).toInt()%10);

}
在paintEvent函数调用,由于未开启定时器,paintEvent函数只调用一次,只能显示固定的值,效果如下:
第四步:开启定时器同步刷新时间显示
添加定时器,每1S刷新一次界面,使用update调用paintEvent函数同步时间显示
 QTimer *timer0  = new QTimer(this);
timer0->start(1000);
    connect(timer0,&QTimer::timeout,[=]()
    {
        update();
    });
最终效果如下:

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

275

主题

3784

帖子

76

粉丝