QT工程的创建与GEC6818交叉编译实现LED的亮灭控制
本片文章涉及1.使用QT实现简单的helloword的程序(包括QT工程的创建)
2.使用QT设计按钮对LED的亮灭进行控制(进行交叉编译)
使用环境:
ubantu16
QT5.7
开发板GEC6818
完整代码在文章末尾可以下载,包括LED的驱动程序
一. make时报错
如果qmake报错时,可尝试执行
报错信息
qmake编译错误:could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or directory
sudo apt-get install qt5-default qtcreator
二、使用QT创建一个简单helloword的应用
step1: 点击创建一个新的项目
打开QT5.7后可以看到上图所示的界面,点击【project】
–>【New project】
step2: 默认创建一个桌面QT应用
直接点击【Application】
–>【QT widgets Application】
,创建一个桌面QT应用,这样初始化就包含一个基于QT设计师的主体框架。
step3: 自定义改工程的名称与路径
step4: 选择组件
step5: 创建类,可以更改类的名称
step6: 工程创建完成
step7: 点击[mainWindow.ui]
打开后可以看到下面界面
step8: 添加一个Label
将左边的Label拖动到右边界面,然后自定义更改文本内容。
step9: 运行
在左下角点击运行(第一个按钮)
运行效果
这是第一个教程,是不需要进行交叉编译的一个简单的文本显示
接下里我们进行一个简单的QT界面控制LED的亮灭。
三、LED基础实验之QT按钮控制LED的亮灭
我们先来进行QT界面的设计和代码的编写,后面再进行驱动的安装与交叉编译等流程
3.1 LED控制ui的设计
3.1.1 ui 界面的设计
刚开始的QT工程的创建和前面的helloworld是相同的,类的名字可以自拟,但是在选择主界面的窗口基类时,选择 QWidget
,如下
建立好工程之后点进ui设计的界面
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
完成如上操作。
3.1.2 按钮代码编写
选择一个按钮,右键
然后转到槽
可以看到
我们使用最简单的第一个就行
双击第一个
或者单击
第一个后点击右下角的ok按钮
,就可以看到生成了一个函数
只要在这个函数中编写相关代码就可以实现,点击open按钮时执行此函数。
我们在这个函数中添加代码
void Led::on_openBtn_clicked()
{
if (fd < 0)
return;
::ioctl(fd, LED1, 0);
::ioctl(fd, LED2, 0);
::ioctl(fd, LED3, 0);
::ioctl(fd, LED4, 0);
}
另一个close的按键也是如此,写入关闭LED的代码
void Led::on_closeBtn_clicked()
{
if (fd < 0)
return;
::ioctl(fd, LED1, 1);
::ioctl(fd, LED2, 1);
::ioctl(fd, LED3, 1);
::ioctl(fd, LED4, 1);
}
完整代码
led.h
#ifndef LED_H
#define LED_H
#include <QWidget>
namespace Ui {
class Led;
}
class Led : public QWidget
{
Q_OBJECT
public:
explicit Led(QWidget *parent = 0);
~Led();
private slots:
void on_openBtn_clicked();
void on_closeBtn_clicked();
private:
Ui::Led *ui;
int fd;
};
#endif // LED_H
led.cpp
#include "led.h"
#include "ui_led.h"
#include<fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#define TEST_MAGIC 'x' //定义幻数
#define TEST_MAX_NR 2 //定义命令的最大序数
//定义LED的魔幻数
#define LED1 _IO(TEST_MAGIC, 0)
#define LED2 _IO(TEST_MAGIC, 1)
#define LED3 _IO(TEST_MAGIC, 2)
#define LED4 _IO(TEST_MAGIC, 3)
Led::Led(QWidget *parent) :
QWidget(parent),
ui(new Ui::Led)
{
ui->setupUi(this);
fd = -1;
fd = ::open("/dev/Led", O_RDWR);
if (fd < 0)
{
qDebug("open led dev fail!!");
}
}
Led::~Led()
{
if (fd > 0)
{
::close(fd);
fd = -1;
}
delete ui;
}
void Led::on_openBtn_clicked()
{
if (fd < 0)
return;
::ioctl(fd, LED1, 0);
::ioctl(fd, LED2, 0);
::ioctl(fd, LED3, 0);
::ioctl(fd, LED4, 0);
}
void Led::on_closeBtn_clicked()
{
if (fd < 0)
return;
::ioctl(fd, LED1, 1);
::ioctl(fd, LED2, 1);
::ioctl(fd, LED3, 1);
::ioctl(fd, LED4, 1);
}
编写完代码后保存。
3.2 交叉编译
进入编写的文件的终端
可以进行快捷操作的如下:
直接在QT软件中右键
左边的文件夹,然后选择在此打开终端
。
然后在终端进行操作
首先需要执行
source /usr/local/Qt-Embedded-5.7.0-env
当然上面的版本需要看自己的环境
然后进行
qmake
第三步是执行
make
make后没有报错就ok
上面三个步骤可以看到如下
为了保险起见可以再进行一次查看(一般不漏第一步就不用)
使用file + 文件名
file led
可以看到是arm架构的,如果是x86或其他则表示之前第一步没有进行。
另如果没有执行第一步也没有查看文件,在开发板上执行的时候会报错
3.3 下载到实验箱、修改权限及运行
3.3.1 传输文件到开发板
使用软件secureCRT
软件,使用rx+文件名(可以自定义)进行文件传输
然后点击Transfer->Send Xmodem
然后选择需要传输的文件,选择我们创建的工程的同名的文件(没有后缀)如下
3.3.2 加载LED驱动
因为我们需要使用到LED所以我们还需要加载led的驱动。
这里我们也可以使用上面rx的命令加载到同一个目录下,在开发板有led.ko这个驱动的前提下,执行
insmod led.ko
如果显示已经存在就可以先卸载使用如下命令
rmmod led.ko //删除驱动程序
可以使用下面命令查看驱动
lsmod led.ko //查看驱动程序
3.3.3 修改权限
由于通过rx命令加载到开发板的文件没有可执行的权限,所以我们需要给他增加可执行权限(x)
可以执行
chmod +x led
3.3.4 运行
通过执行下面指令执行程序(./+文件名)
./led
写在最后:
本文章设计的实验代码在我的github上进行下载:GEC6818_QT_experiments-led.rar