4546|12

189

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

我的嵌入式Qt开发第一课——基于BBB和hmc5843三轴电子罗盘 [复制链接]

 




几次想照着课本系统地学习Qt,但我发现还是有具体问题驱动时学习比较快。于是我给自己设定了这个任务:
读取HMC5843的三轴磁场强度值,计算出角度,并把角度用直观形式显示在图形界面上。
这里面涉及到一些问题,接下来就用问答的形式记录一下。

Q1: 搭建Ubuntu-BBB的Qt交叉编译环境、配置触摸屏:
A1: http://blog.csdn.net/wyt2013/article/details/18549415

Q2: 去掉Qt界面的标题栏
A2:
在mainwindow.cpp中MainWindow(QWidget *parent)函数里的ui->setupUI(this);下添加一行即可
  1. this->setWindowFlags(Qt::FramelessWindowHint);
复制代码


Q3: 去掉鼠标指针,保留触摸操作
A3:
首先include
然后在mainwindow.cpp中MainWindow(QWidget *parent)函数里的ui->setupUI(this);下添加一行即可
  1. QWSServer::setCursorVisible(false);  
复制代码


Q4: 在Qt中实现定时中断
A4:
使用QTimer。
在mainwindow.cpp中构造函数MainWindow(QWidget *parent)里的ui->setupUI(this);下添加
  1. QTimer *timer = new QTimer(this);  
  2. connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));  
  3. timer->start(T);
复制代码

这样就设定好了一个周期为T毫秒的类似定时中断的东西。每过T毫秒就会触发一次timerUpDate()函数。
别忘了在MainWindow类中添加timerUpDate()函数声明:
  1. private slots:  
  2.     void timerUpDate();
复制代码

然后就是编写timerUpDate()函数体了。
注意如果函数体内做的事情耗时超过了定时周期T,Qt不会像单片机的定时中断那样挂掉,而是会尽可能完成每次任务,导致整体定时周期延长。
我这里就在这个函数中实现了定时读取I2C设备的数值,并更新各个UI元素。

Q5: 如何测试函数执行时间
A5:
使用gettimeofday()函数获取微秒为单位的时间。
  1. #include<stdio.h>  
  2. #include<sys/time.h>  
  3. #include<unistd.h>  
  4.   
  5. int main()  
  6. {  
  7.     struct  timeval start;  
  8.     struct  timeval end;  
  9.          
  10.     unsigned  long diff;  
  11.     gettimeofday(&start,NULL);  
  12.     //Put things you want to test here.  
  13.     gettimeofday(&end,NULL);  
  14.     diff = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;  
  15.     printf("It took %ld us.\n",diff);  
  16.     return 0;  
  17. }
复制代码


Q6: 如何画直线图形
A6:
用QPainter。
首先引用头文件
  1. #include <QPainter>  
  2. #include <QPointF>
复制代码

在.h文件中添加声明
  1. private:  
  2.     void paintEvent(QPaintEvent *);
复制代码

然后在函数里实现绘图
  1. void MainWindow::paintEvent(QPaintEvent *)  
  2. {  
  3.      QPainter painter(this);  
  4.      QPen pen;  
  5.   
  6.      pen.setColor(Qt::darkRed);  
  7.      painter.setPen(pen);  
  8.      static const QPointF points[4] = {QPointF(-50, 0), QPointF(50, 10), QPointF(50, -10),QPointF(-50, 0)};  
  9.      painter.drawPolyline(points, 4);  
  10. }
复制代码

屏幕左上角是坐标(0,0)点。这里就绘制出了我第一个图片中所示的三角形。

Q7: 如何定时刷新图形
A7:
上面给出的是绘制静止图片的方法,想绘制动态图片的话只需要在前面提到的定时中断timerUpDate()函数中增加一句
  1. update();
复制代码


Q8: 如何旋转图形
A8:
可以直接旋转坐标系来实现。首先将坐标系原点平移到旋转中心点,然后旋转坐标系即可。在paintEvent(QPaintEvent *)中增加
  1. painter.translate(200,160);   
  2. painter.rotate(dir);
复制代码


Q9: 如何绘制波形图
A9:
使用QPainterPath。
在.h文件中添加定义 QPainterPath path;
在paintEvent中使用如下三行:
  1. this->path.lineTo(num,-dir/4);  
  2. painter.translate(300-num,180);  
  3. painter.drawPath(this->path);
复制代码

这里num是一个每次定时中断都会自增的变量。所以lineTo(num,-dir/4);会绘制历史上所有的线,以及绘制最近一个端点和(num,-dir/4)这个坐标的连线。
translate(300-num,180);将坐标每次都向左平移一个单位。

Q10: 如何添加退出程序按钮
A10:
在图形界面拖放一个PushButton,右键点击之,选择"Go to slot",然后选择第一个clicked(),这时Qt creator会自动跳到void MainWindow::on_pushButton_clicked()函数中。在里面添加:
  1. QApplication* app;  
  2. app->quit();
复制代码

调试时建议用这个按钮退出程序,而非使用Qt creator上的停止按钮。因为有时停止按钮会失效,然后就只能重启BBB了。

完整的源代码放到了我的github里,欢迎参考
https://github.com/wytalfred/Beaglebone-magnetometer-Qt-display
https://github.com/wytalfred/beaglebone-mag-scope


最新回复

感谢分享。  详情 回复 发表于 2014-4-20 19:12

赞赏

4

查看全部赞赏

点赞 关注(4)
个人签名更多BBB经验分享,请访问我的博客http://blog.csdn.net/wyt2013
 

回复
举报

1185

帖子

1

TA的资源

纯净的硅(高级)

推荐
 
感谢分享。
 
 

回复

2002

帖子

24

TA的资源

五彩晶圆(高级)

推荐
 
不错,很厉害
 
 
 

回复

1531

帖子

49

TA的资源

五彩晶圆(中级)

板凳
 
学习下
个人签名NXP新年新气象大家一起嗨起来 + 恩智浦KW41Z有奖创意征集令高能来袭 +https://www.eeworld.com.cn/huodong/201611_NXPKW41ZActivity1/index.html
 
 
 

回复

1246

帖子

18

TA的资源

五彩晶圆(初级)

4
 
很有帮助!!感谢分享!
个人签名
 
 
 

回复

846

帖子

0

TA的资源

纯净的硅(中级)

5
 
不错,很好
 
 
 

回复

1173

帖子

3

TA的资源

五彩晶圆(初级)

6
 
正在准备学习QT呢
 
 
 

回复

115

帖子

0

TA的资源

一粒金砂(中级)

7
 
有qt的帖子都得顶
 
 
 

回复

774

帖子

2

TA的资源

纯净的硅(中级)

8
 
我是直接用qwt里的示波器源码修改
不是自己写的代码果然看着很难受啊

点评

哈哈,我决定能不用qwt尽量不用。反正暂时也用不上那么高大上的界面~  详情 回复 发表于 2014-4-19 23:05
 
 
 

回复

189

帖子

0

TA的资源

纯净的硅(初级)

9
 
airqj 发表于 2014-4-19 22:36
我是直接用qwt里的示波器源码修改
不是自己写的代码果然看着很难受啊

哈哈,我决定能不用qwt尽量不用。反正暂时也用不上那么高大上的界面~

点评

在嵌入式平台上现在好像还不能用qwt designer 所有的组件都得自己添加  详情 回复 发表于 2014-4-20 08:51
个人签名更多BBB经验分享,请访问我的博客http://blog.csdn.net/wyt2013
 
 
 

回复

774

帖子

2

TA的资源

纯净的硅(中级)

10
 
wytalfred 发表于 2014-4-19 23:05
哈哈,我决定能不用qwt尽量不用。反正暂时也用不上那么高大上的界面~

在嵌入式平台上现在好像还不能用qwt designer
所有的组件都得自己添加

点评

深表同情……  详情 回复 发表于 2014-4-20 09:20
 
 
 

回复

189

帖子

0

TA的资源

纯净的硅(初级)

11
 
airqj 发表于 2014-4-20 08:51
在嵌入式平台上现在好像还不能用qwt designer
所有的组件都得自己添加

深表同情……
个人签名更多BBB经验分享,请访问我的博客http://blog.csdn.net/wyt2013
 
 
 

回复

110

帖子

0

TA的资源

一粒金砂(中级)

12
 
写的不错啊,谢谢lz分享
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表