几次想照着课本系统地学习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.\n",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

我的嵌入式Qt开发第一课——基于BBB和hmc5843三轴电子罗盘的更多相关文章

  1. 【应用笔记】【AN005】Qt开发环境下基于RS485的4-20mA电流采集

    简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍在Qt开发环境下基于RS485实现4-20mA电流采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成 ...

  2. 嵌入式Qt开发环境的搭建详解

    一.嵌入式Qt开发环境的搭建前奏 1.下载arm-linux-gcc-4.4.3-20100728.tar.gz 2.下载qt-everywhere-opensource-src-4.8.5.tar. ...

  3. 嵌入式QT开发视频教程-供参考

    免费嵌入式QT开发视频教程 https://pan.baidu.com/s/1bprhJ2Z QT初级到高级编程视频教程--丁林松.rarhttp://www.jisoupan.com/share/2 ...

  4. 基于arm的嵌入式QT开发(课程设计)

    一. 项目要求 配置QT5.7基于x86及arm 等两种CPU架构的调试及开发环境: 移植arm编译后的QT5.7及屏幕校准工具tslib1.4至CORTEX ARM9实验平台: 开发基于QT5.7的 ...

  5. Ubuntu下嵌入式Qt开发环境配置全攻略

    http://qpcwth.blog.163.com/blog/static/20993024620139151424822/ 在安装的过称中,出现一些问题,注意试想: 1.本次开发环境的配置,是基于 ...

  6. PHP扩展开发 第一课 为什么要写扩展及hello world

    PHP扩展开发其实很简单.那为什么要扩展开发呢. 这里咱们以实际的案例进行对比. 第一步,进入 php源码包   http://www.php20.com/forum.php?m ... =159&a ...

  7. React Native ios开发第一课

    前言 本篇文章的作用在于帮助你快速上手使用React Native编写iOS应用.如果你现在还不太了解React Native是什么以及Facebook为什么要创建React Native,你可以先看 ...

  8. php开发第一课

    开发环境:wampserver IDE工具:sublime2 问题记录: 1.如何避免在php中中文乱码? 在php头部加入:<meta charset="utf-8"> ...

  9. 1.QT开发第一个程序

    Ubuntu16.04安装QT5.8.0:http://www.cnblogs.com/dotnetcrazy/p/6725945.html QT5.8支持中文输入法(附带老版本的解决+不理想的情况解 ...

随机推荐

  1. hdu 1233 还是畅通project (克鲁斯卡尔裸题)

    还是畅通project                                              Time Limit: 4000/2000 MS (Java/Others)    M ...

  2. php实现希尔排序(总结)

    php实现希尔排序(总结) 一.总结 1.希尔排序的算法思路:分组排序, 缩小增量排序,插入排序 2.算法思路: 循环非常好写 有几次gap:log2(n) 每次gap有几组:gap组 每组有几个元素 ...

  3. 1.19 Python基础知识 - 软件目录开发规范及不同模块之间的调用

    一个软件项目的开发,除了需要很厉害的开发能力,同时在软件开发项目时,也需要对项目结构有良好的组织能力,将功能进行拆分,不同的功能放在不同的目录或文件中,方便日后的维护,升级等操作.比如核心代码的目录, ...

  4. Linux 服务器初始配置步骤

    1.IP配置 vim /etc/sysconfig/network-scripts/ifcfg- BOOTPROTO=dhcp 改成 static ONBOOT=no 改成 yes 添加 IPADDR ...

  5. 一个理性战胜感性的成功案例:P2P投资和活期理财,纠结中提炼出来的1个数学问题

    我经常是投资了P2P,然后用钱,因而损失了一部分收益. 这是一个让我纠结的问题,为了解决这个问题,我不再凭感觉,而是从现实情况,提炼出来1个数学题,解答我的疑惑. 这是一个理性战胜感性的成功案例~ P ...

  6. PatentTips - Virtual machine management using processor state information

    BACKGROUND OF THE INVENTION The invention generally relates to virtual machine management, and more ...

  7. [Angular] Custom directive Form validator

    Create a directive to check no special characters allowed: import {Directive, forwardRef} from '@ang ...

  8. 40.【IntelliJ IDEA】使用idea解决新建jsp文件而找不到jsp文件模版的新建选项

    转自:https://www.cnblogs.com/sxdcgaq8080/p/7676294.html 使用idea解决新建jsp文件而找不到jsp文件模版的新建选项,这样每次创建一个新的jsp文 ...

  9. 微软重生:4年市值U型大逆转,超越谷歌重返巅峰!

    划重点: 智东西(公众号:zhidxcom)文 | 寓扬 在最近的两个星期里,微软和谷歌正在进行一场市值大比拼,双方在7700亿美元上下厮杀正紧,抢夺着全球市值第三大公司的宝座(前两位为市值超过900 ...

  10. Python Tricks(二十)—— 阶乘的极简实现

    使用 reduce # 比如计算 9 的阶乘 >> reduce(lambda x, y: x*y, range(1, 9+1)) 362880 当然这里的 reduce 直接返回具体的数 ...