查看: 625|回复: 0

[评测分享] 【更适合初学者的开发板ELF 1】08-QT程序的编译测试2

[复制链接]
  • TA的每日心情
    奋斗
    昨天 22:50
  • 签到天数: 94 天

    连续签到: 3 天

    [LV.6]常住居民II

    发表于 2023-12-1 22:29:29 | 显示全部楼层 |阅读模式
    分享到:
    这次使用QT开发一个在开发板上运行的图形界面程序,用于显示系统时钟。
    QT下新建一个dialog的项目,然后在头文件dialog.h中编写如下内容:
    1. #ifndef DIALOG_H
    2. #define DIALOG_H

    3. #include <QDialog>
    4. #include <QPainter>
    5. #include <QPen>
    6. #include <QColor>
    7. #include <QPointF>
    8. #include <QtMath>
    9. #include <QDateTime>
    10. #include <QTime>

    11. QT_BEGIN_NAMESPACE
    12. namespace Ui { class Dialog; }
    13. QT_END_NAMESPACE
    14. class Dialog : public QDialog
    15. {
    16.     Q_OBJECT
    17. public:
    18.     Dialog(QWidget *parent = nullptr);
    19.     ~Dialog();
    20. protected:
    21.     void paintEvent(QPaintEvent *event) override;
    22.     void resizeEvent(QResizeEvent *event) override;
    23.     void timerEvent(QTimerEvent *event) override;
    24. private:
    25.     Ui::Dialog *ui;
    26.     double SL=500;
    27.     //hour pointer
    28.     QColor ch=QColor(255,0,0);
    29.     QPen ph=QPen(ch,8);
    30.     //minute pointer
    31.     QColor cm=QColor(0,255,0);
    32.     QPen pm=QPen(cm,4);
    33.     //second pointer
    34.     QColor cs=QColor(0,0,255);
    35.     QPen ps=QPen(cs,2);
    36.     QColor cL=QColor(255,0,255);
    37.     QPen pL=QPen(cL,3);
    38.     QColor cW=QColor(0,128,0);
    39.     QPen pW=QPen(cW,5);
    40. };
    41. #endif // DIALOG_H
    复制代码
    然后是源文件dialog.c中:
    1. #include "dialog.h"
    2. #include "ui_dialog.h"
    3. #include "QDebug"

    4. #include <QResizeEvent>

    5. Dialog::Dialog(QWidget *parent)
    6.     : QDialog(parent)
    7.     , ui(new Ui::Dialog)
    8. {
    9.     ui->setupUi(this);
    10.     setMinimumSize(500,500);
    11.     resize(SL,SL);
    12.     startTimer(499);
    13. }

    14. Dialog::~Dialog()
    15. {
    16.     delete ui;
    17. }

    18. void Dialog::paintEvent(QPaintEvent *event)
    19. {
    20.     Q_UNUSED(event)
    21.     QPainter painter(this);
    22.     QPoint pc(width()/2,height()/2);
    23.     //draw tick
    24.     painter.setPen(pL);
    25.     for(int i=0;i<60;i++)
    26.     {
    27.         double delt=2*M_PI/60;
    28.         double R,r;
    29.         R=SL/2;
    30.         r=0.95*R;
    31.         QPointF p1(pc.x()+R*qCos(delt*i),pc.y()+R*qSin(delt*i));
    32.         QPointF p2(pc.x()+r*qCos(delt*i),pc.y()+r*qSin(delt*i));
    33.         painter.drawLine(p1,p2);
    34.     }

    35.     painter.setPen(pW);
    36.     for(int i=0;i<12;i++)
    37.     {
    38.         double delt=2*M_PI/12;
    39.         double R,r;
    40.         R=SL/2;
    41.         r=0.9*R;
    42.         QPointF p1(pc.x()+R*qCos(delt*i),pc.y()+R*qSin(delt*i));
    43.         QPointF p2(pc.x()+r*qCos(delt*i),pc.y()+r*qSin(delt*i));
    44.         painter.drawLine(p1,p2);
    45.     }

    46.     QTime now=QDateTime::currentDateTime().time();
    47.     double angle;
    48.     int s=now.second();
    49.     int m=now.minute();
    50.     int h=now.hour();
    51.     QString str=QString("%1:%2:%3")\
    52.             .arg(h,2,10,QChar('0'))\
    53.             .arg(m,2,10,QChar('0'))\
    54.             .arg(s,2,10,QChar('0'));
    55.     setWindowTitle(str);

    56.     painter.setFont(QFont("Arial",20,1,false));
    57.     painter.drawText(pc.x()+30,pc.y(),str);

    58.     //draw hour
    59.     painter.setPen(ph);
    60.     double Rh=SL/2*0.7;
    61.     if(h>12)h-=12;
    62.     angle=((h+m/60.0f+s/3600.0f)*30-90)*M_PI/180.0;
    63.     QPointF ph(pc.x()+Rh*qCos(angle),pc.y()+Rh*qSin(angle));
    64.     painter.drawLine(pc,ph);
    65.     //draw minute
    66.     painter.setPen(pm);
    67.     double Rm=SL/2*0.8;
    68.     angle=((m+s/60.0f)*6-90)*M_PI/180.0;
    69.     QPointF pm(pc.x()+Rm*qCos(angle),pc.y()+Rm*qSin(angle));
    70.     painter.drawLine(pc,pm);
    71.     //draw second
    72.     painter.setPen(ps);
    73.     double Rs=SL/2*0.95;
    74.     angle=(s*6-90)*M_PI/180.0;
    75.     QPointF ps(pc.x()+Rs*qCos(angle),pc.y()+Rs*qSin(angle));
    76.     painter.drawLine(pc,ps);
    77. }
    78. void Dialog::resizeEvent(QResizeEvent *event)
    79. {
    80.     SL=event->size().width();
    81.     if(SL>event->size().height())
    82.         SL=event->size().height();
    83.     SL*=0.95;
    84. }
    85. void Dialog::timerEvent(QTimerEvent *event)
    86. {
    87.     Q_UNUSED(event)
    88.     update();
    89. }
    复制代码
    主要的功能代码在paintEvent中,就是定时给窗口重绘的事件,然后在timerEvent中反复调用update,让窗口重绘。
    将代码放入虚拟机Ubuntu中,然后还是按上节的方法,编译:
    Screenshot from 2023-12-01 22-28-49.png
    编译完成以后,放入开发板中,赋予可执行权限,运行:
    2023-12-01_222413.png
    最后运行效果如下(没有显示屏,只能使用MobaXTerm的X Server先显示):
    2023-12-01_222015.png
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-5-20 19:06 , Processed in 0.113389 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.