回答

收藏

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

#板卡评测 #板卡评测 1879 人阅读 | 0 人回复 | 2023-12-01

这次使用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中,然后还是按上节的方法,编译:

编译完成以后,放入开发板中,赋予可执行权限,运行:

最后运行效果如下(没有显示屏,只能使用MobaXTerm的X Server先显示):

分享到:
回复

使用道具 举报

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

本版积分规则

关闭

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