22回答

1收藏

【懒兔子玩树莓】树莓派2本地开发Qt GUI程序--更新完整工程

 

#开源分享 #开源分享 25540 人阅读 | 22 人回复 | 2015-03-12

本帖最后由 懒兔子 于 2015-7-10 18:38 编辑

写在前面:

在这段一个人的生活中,想要静下来做点事情。翻来想去,不如读书、学习,借助手里的这两块树莓派,正好如愿。

于是决定把自己的学习和体验记录下来,一来给自己留作日后的参考,同时也为自己关于使用开源硬件建立快速原型设计平台的构想储备些知识。

====================================================================

1.Qt Creator的安装及配置

首先通过apt-get安装Qt Creator工具,同时会自动安装4.8版本的Qt-Lib库。

  1. $ sudo apt-get install qtcreator
复制代码

通过桌面Menu -> Programming -> QtCreator 启动图形界面。


由于Qt Creator不能自动识别树莓派上的工具链,因此需要手动添加。点击Tools -> Options打开配置对话框,在Build & Run -> Tool Chains选项卡中点击Add添加GCC工具链,Compiler设置为/usr/bin/gcc,Debugger可设置为/usr/bin/gdb。



完成设置后我们可以通过一个简单的工程验证Qt是否可用。建立一个Qt Gui Application工程HelloQt。添加一个Label和Push Button。在Button上右键选择go to slot。



选择Clicked()信号槽(即事件)。



在on_pushButton_clicked()事件执行函数中添加改变label文字的语句。

  1. void HelloQt::on_pushButton_clicked()
  2. {
  3.     ui->label->setText("Hello Qt!");
  4. }
复制代码

保存工程,通过按钮编译工程。这时候还无法直接在Qt Creator中运行编译好的程序,这是因为缺少某些设置,我们稍后再讲。打开工程的编译目录(兔子这里是helloQt-build-embedded-Qt_4_8_2_in_PATH__System__Release),可以发现已经有编译好的可执行文件helloQt,双击执行即可。


运行效果:



2.在Qt工程中调用WiringPi

新建一个Qt Gui Application工程HelloWP。在窗口中添加一个Label和两个Push Button,Button分别命名为LED On和LED Off。为两个Button分别添加Slot。这里通过两个按键控制LED的亮灭状态,通过label显示开关状态。由一个QTimer定时器负责读取并刷新按键的状态。



将树莓派的BCM_GPIO18连接LED (低电平导通),BCM_GPIO17 连接开关按键(按下时为低电平)。注意这里使用的是Broadcom芯片原始的GPIO定义。


修改hellowp.cpp文件代码如下:

  1. #include "hellowp.h"
  2. #include "ui_hellowp.h"
  3. #include "wiringPi.h"

  4. helloWP::helloWP(QWidget *parent) :
  5.     QMainWindow(parent),
  6.     ui(new Ui::helloWP)
  7. {   
  8.     ui->setupUi(this);
  9.     wiringPiSetupSys();
  10.     pinMode(18, OUTPUT);
  11.     pinMode(17, INPUT);
  12.     digitalWrite(18, HIGH);

  13.     switch_timer = new QTimer();
  14.     connect(switch_timer, SIGNAL(timeout()), this, SLOT(timerUpDate()));
  15.     switch_timer->start(100);

  16. }

  17. helloWP::~helloWP()
  18. {
  19.     delete ui;
  20. }

  21. void helloWP::timerUpDate()
  22. {
  23.     if(digitalRead(17) == LOW)
  24.         ui->label->setText("Switch is On!");
  25.     else
  26.         ui->label->setText("Switch is OFF!");
  27. }

  28. void helloWP::on_pushButton_clicked()
  29. {
  30.     digitalWrite(18, LOW);
  31. }

  32. void helloWP::on_pushButton_2_clicked()
  33. {
  34.     digitalWrite(18, HIGH);
  35. }
复制代码

修改hellowp.h文件代码如下:

  1. #ifndef HELLOWP_H
  2. #define HELLOWP_H

  3. #include <QMainWindow>
  4. #include <QtCore>

  5. namespace Ui {
  6. class helloWP;
  7. }

  8. class helloWP : public QMainWindow
  9. {
  10.     Q_OBJECT
  11.    
  12. public:
  13.     explicit helloWP(QWidget *parent = 0);
  14.     ~helloWP();
  15.    
  16. private slots:
  17.     void on_pushButton_clicked();
  18.     void on_pushButton_2_clicked();
  19.     void timerUpDate();

  20. private:
  21.     Ui::helloWP *ui;
  22.     QTimer *switch_timer;

  23. };

  24. #endif // HELLOWP_H
复制代码

此时对工程进行编译会报错,提示找不到wiringPi相关的函数。这是因为我们需要手动添加编译参数,将wiringPi库包含进工程中。

使用文本编辑器打开helloWP.pro工程文件,在末尾添加:

LIBS += -lwiringPi


保存后再编译即可通过。


下面手动设置执行参数使程序可以在Qt中直接执行。在Projects -> Run Settings选项卡的Run configuration栏中添加Custom Executable,将Executable属性设置为%{buildDir}/helloWP(将helloWP替换为你的工程编译生成的可执行文件即可)。



此时便可以通过Qt自动编译执行程序了。



需要注意的是,我们使用的wiringPiSetupSys()初始化函数需要额外export操作才能使用GPIO。这和一般引用了wiringPi的C程序是相同的。如果使用wiringPiSetup()函数则不需要export操作,但是编译好的程序必须在root权限下执行。

export指令为:

  1. $ gpio export 17 in
  2. $ gpio export 18 out
复制代码

我们也可以将这一命令添加到Qt Creator中,使其编译运行时自动执行。只需在Deployment中添加Custom Process即可。如下图:



程序执行效果如图,按键控制LED亮灭,开关的状态也实时显示在窗口中。


最后是打包好的工程文件:

helloWP.rar (3.74 KB, 下载次数: 70)


一只搞电子的懒兔子~~
分享到:
回复

使用道具 举报

回答|共 22 个

倒序浏览

沙发

haothree

发表于 2015-3-12 08:38:39 | 只看该作者

这东西好
板凳

小菜儿

发表于 2015-3-12 08:42:38 | 只看该作者

原创支持,给力!
地板

fjjjnk1234

发表于 2015-3-12 13:34:50 | 只看该作者

顶一个!写得真详细!
相由心生境随心转一切法从心想生
5#

franki

发表于 2015-3-12 17:03:33 | 只看该作者

不知道编译的时候流畅否   ,会不会卡
6#

懒兔子

发表于 2015-3-12 17:40:25 | 只看该作者

franki 发表于 2015-3-12 17:03
不知道编译的时候流畅否   ,会不会卡

编译比较流畅,本地GCC用起来还是很给力的
一只搞电子的懒兔子~~
7#

lwd-345285

发表于 2015-3-16 09:20:13 | 只看该作者

之前移植Qt5程序在树莓派上跑,结果程序自动全屏,而且不能调整尺寸,其他功能一切正常,不知道楼主是否搞过?
8#

懒兔子

发表于 2015-3-18 16:29:56 | 只看该作者

RE: 【一网打尽】【懒兔子玩树莓】树莓派2本地开发Qt GUI程序

lwd-345285 发表于 2015-3-16 09:20
之前移植Qt5程序在树莓派上跑,结果程序自动全屏,而且不能调整尺寸,其他功能一切正常,不知道楼主是否搞 ...

我一直都在用QT4.8啊,没用过QT5。不过你之前都是交叉编译吧,兼容性不好保证,试试本地装上QT5的库来编译运行?
一只搞电子的懒兔子~~
9#

qunimadb

发表于 2015-6-6 01:25:56 | 只看该作者

后面关于利用wiringPi控制LED的程序有问题吧
10#

懒兔子

发表于 2015-6-9 14:57:28 | 只看该作者

qunimadb 发表于 2015-6-6 01:25
后面关于利用wiringPi控制LED的程序有问题吧

嗯,那是第一个例子的。第二个例子的工程找不到了。
配置没几步,用帖子里的代码自己建一个工程就行
一只搞电子的懒兔子~~
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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