我的嵌入式qt开发第一课——基于bbb和hmc5843三轴电子罗盘

llguanli llguanli     2022-09-09     244

关键词:

技术分享

技术分享

几次想照着课本系统地学习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);下加入一行就可以

this->setWindowFlags(Qt::FramelessWindowHint);


Q3: 去掉鼠标指针。保留触摸操作

A3: 

首先include <QWSServer>
然后在mainwindow.cpp中MainWindow(QWidget *parent)函数里的ui->setupUI(this);下加入一行就可以

QWSServer::setCursorVisible(false);

Q4: 在Qt中实现定时中断

A4: 

使用QTimer。

在mainwindow.cpp中构造函数MainWindow(QWidget *parent)里的ui->setupUI(this);下加入

    QTimer *timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));
    timer->start(T);
这样就设定好了一个周期为T毫秒的类似定时中断的东西。每过T毫秒就会触发一次timerUpDate()函数。

别忘了在MainWindow类中加入timerUpDate()函数声明:

private slots:
    void timerUpDate();
然后就是编写timerUpDate()函数体了。

注意假设函数体内做的事情耗时超过了定时周期T,Qt不会像单片机的定时中断那样挂掉,而是会尽可能完毕每次任务,导致总体定时周期延长。

我这里就在这个函数中实现了定时读取I2C设备的数值,并更新各个UI元素。


Q5: 怎样測试函数运行时间

A5: 

使用gettimeofday()函数。

#include<stdio.h>
#include<sys/time.h>
#include<unistd.h>

int main()
{
	struct  timeval start;
	struct  timeval end;
       
	unsigned  long diff;
	gettimeofday(&start,NULL);
	//Put things you want to test here.
	gettimeofday(&end,NULL);
	diff = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;
	printf("It took %ld us.
",diff);
	return 0;
}

Q6: 怎样画直线图形

A6: 

用QPainter。

首先引用头文件

#include <QPainter>
#include <QPointF>
在.h文件里加入声明
private:
    void paintEvent(QPaintEvent *);
然后在函数里实现画图
void MainWindow::paintEvent(QPaintEvent *)
{
     QPainter painter(this);
     QPen pen;

     pen.setColor(Qt::darkRed);
     painter.setPen(pen);
     static const QPointF points[4] = {QPointF(-50, 0), QPointF(50, 10), QPointF(50, -10),QPointF(-50, 0)};
     painter.drawPolyline(points, 4);
}
屏幕左上角是坐标(0,0)点。

这里就绘制出了我第一个图片中所看到的的三角形。


Q7: 怎样定时刷新图形

A7: 

上面给出的是绘制精巧图片的方法。想绘制动态图片的话仅仅须要在前面提到的定时中断timerUpDate()函数中添加一句

update();


Q8: 怎样旋转图形

A8:

能够直接旋转坐标系来实现。首先将坐标系原点平移到旋转中心点,然后旋转坐标系就可以。在paintEvent(QPaintEvent *)中添加

     painter.translate(200,160); 
     painter.rotate(dir);


Q9: 怎样绘制波形图

A9:

使用QPainterPath。

在.h文件里加入定义 QPainterPath path;
在paintEvent中使用例如以下三行:

this->path.lineTo(num,-dir/4);
painter.translate(300-num,180);
painter.drawPath(this->path);
这里num是一个每次定时中断都会自增的变量。

所以lineTo(num,-dir/4);会绘制历史上全部的线,以及绘制近期一个端点和(num,-dir/4)这个坐标的连线。

translate(300-num,180);将坐标每次都向左平移一个单位。


Q10: 怎样加入退出程序button

A10:

在图形界面拖放一个PushButton,右键点击之。选择"Go to slot",然后选择第一个clicked()。这时Qt creator会自己主动跳到void MainWindow::on_pushButton_clicked()函数中。在里面加入:

    QApplication* app;
    app->quit();
调试时建议用这个button退出程序,而非使用Qt creator上的停止button。由于有时停止button会失效,然后就仅仅能重新启动BBB了。




完整的源码放到了我的github里。欢迎參考

https://github.com/wytalfred/Beaglebone-magnetometer-Qt-display

https://github.com/wytalfred/beaglebone-mag-scope









































第一课

...言脚本语言(Scriptinglanguage)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序。以简单的方式快速完成某些复杂的事情通常是创造脚本语言的重要原则,基于这项原则,使得脚本语言通常比C语言、C++语言或Java... 查看详情

django第一课基于django超市订单管理系统开发(代码片段)

概念django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架,采用的是MTV架构模式进行分层架构。项目搭建打开pycharm开发软件,打开开发软件的内置dos窗口操作命令行在这里指定项目存放的磁盘路径,... 查看详情

django第一课基于django图书借阅管理网站平台(代码片段)

概念django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架,采用的是MTV架构模式进行分层架构。项目搭建打开pycharm开发软件,打开开发软件的内置dos窗口操作命令行在这里指定项目存放的磁盘路径,... 查看详情

qt第一课环境安装

1下载QT1)进入官网:https://www.qt.io/2)点击Download:https://www.qt.io/download/3)找到OpenSource,点击GetStarted:https://www.qt.io/download-open-source/4)检测到主机是windows,实际需要下载Linux32bit版本,点击ViewAllDownLoads:https://w 查看详情

基于c++11的事件驱动框架

嵌入式开发中对资源是有严格的要求的,在学校的时候一直使用qt,可是qt库越来越大,在一些低端的嵌入式设备上,我们可能只是简单的几个界面。这里我想基于opengl开发一个简单的程序框架,用来开速开发... 查看详情

运维第一课——计算机组成与操作

...级计算机、工业控制计算机、网络计算机、个人计算机、嵌入式计算机五类,较先进的计算机有生物计算机、光子计算机、量子计算机等。 &nb 查看详情

软件工程第一课

...论它用做什么,总之不可能是一个无脑团体简单堆积代码开发出来的,不管是软件的需求分析,还是设计框架,还是中间的开发任务分配,还是最后的设计和维护都是开发一个好的软件所 查看详情

上云第一课,开年实验班,重磅上线!

玩转上云第一课,快速晋级为专业的“云上开发者”,四大专期助力快速云上实践!首期基础产品进阶专期:基于ECS搭建云上个人论坛、基于OSS搭建云上个人博客、使用Spark/Hive分析OSS-HDFS数据等实验已开启。上云... 查看详情

spring第一课spring框架的环境搭建和使用

概念Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应... 查看详情

《基于qt的嵌入式传感器数据管理系统的设计》二qt的下载以及开发环境的搭建(代码片段)

1.QT下载Qt入门教程Qt是一个跨平台的C++框架(C++库),目前最新的版本是Qt5。Qt5还包含了很多小版本,其中推荐Qt5.6或Qt5.9,这两个版本是LTS版本(即长期支持版本),Bug较少,相对... 查看详情

《基于qt的嵌入式传感器数据管理系统的设计》二qt的下载以及开发环境的搭建(代码片段)

1.QT下载Qt入门教程Qt是一个跨平台的C++框架(C++库),目前最新的版本是Qt5。Qt5还包含了很多小版本,其中推荐Qt5.6或Qt5.9,这两个版本是LTS版本(即长期支持版本),Bug较少,相对... 查看详情

django第一课基于django超市订单管理系统开发(代码片段)

概念django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架,采用的是MTV架构模式进行分层架构。项目搭建打开pycharm开发软件,打开开发软件的内置dos窗口操作命令行在这里指定项目存放的磁盘路径,... 查看详情

用于交叉编译 BBB 应用程序的工具链

...licationsforBBB【发布时间】:2017-06-1413:34:39【问题描述】:我的本​​机是基于ubuntu的14.04LTSx86_64系统,我想为Beagleboneblack交叉编译应用程序和QT程序,这是一个在Debian2015发行版上运行的基于armv7的系统。我应该在我的本地系统上... 查看详情

零基础学html5和css3前端开发第一课(代码片段)

...程目标:使用HTML5进行网站布局使用CSS3进行网站美化开发精美的商业网站第一章HTML5基础概念:网页:互联网的基础,网络页面,网页:文字、图片、声音、视频、VR虚幻等;网站:淘宝网、京东、亚马... 查看详情

零基础学html5和css3前端开发第一课(代码片段)

...程目标:使用HTML5进行网站布局使用CSS3进行网站美化开发精美的商业网站第一章HTML5基础概念:网页:互联网的基础,网络页面,网页:文字、图片、声音、视频、VR虚幻等;网站:淘宝网、京东、亚马... 查看详情

mybatis第一课mybatis的框架的搭建和使用(代码片段)

概念MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iB... 查看详情

qt5.9.1结合ref开发基于chorm的浏览器

下载cef3的源码cef简介  嵌入式Chromium框架(简称CEF)是一个由MarshallGreenblatt在2008建立的开源项目,它主要目的是开发一个基于GoogleChromium的Webbrowser控件。CEF支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有的... 查看详情

sylixosqt基于framebuffer渲染界面

...很强的跨平台能力,可移植性好,被广泛应用在PC端以及嵌入式领域。Qt可大致分为两部分:QtGui和QtCore,QtGui提供开发人员一套完整的开发控件,可以快速开发客户端界面;QtCore则负责底层渲染以及事件驱动等。而本章节主要介... 查看详情