0.总结
无论采用哪种方式都要把led相关操作封装成一个类,用面向对象的思想
1.新建工程->application->qt widgets application
2.拖两个button分别表示打开,关闭,控件改名
3.右键led工程名字下添加)>新建->c++ class
4.命名为Led,基类选择qobject
5.最后目录如下
1.方式1
主要是把原来访问驱动的APP拿过来,混合c/c++编程。
led.h代码如下
#ifndef LED_H
#define LED_H
#include <QObject>
//为了可以调用c函数
extern "C"{
#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
}
#define LED_ON 1
#define LED_OFF 0
class Led : public QObject
{
Q_OBJECT
public:
explicit Led(QObject *parent = nullptr);
//自己添加的begin
int fd, retvalue;
const char *filename;//文件名也没用上,写死
unsigned char databuf[1];//传递的参数,没用上
void led_on();
void led_off();
//自己添加的end
signals:
};
#endif // LED_H
led.cpp代码如下
#include "led.h"
Led::Led(QObject *parent) : QObject(parent)
{
fd = open("/dev/beep", O_RDWR);
if(fd < 0){
return ;
}
}
void Led:: led_on()
{
databuf[0]=1;
retvalue=::write(fd,databuf,sizeof(databuf));
if(retvalue < 0){
::close(fd);//迅为教程说C语言函数前面要加这个::,表示这个函数是c函数,也可以不加
return ;
}
}
void Led:: led_off()
{
databuf[0] = 0;
retvalue = ::write(fd, databuf, sizeof(databuf));
if(retvalue < 0){
::close(fd);
return ;
}
}
widget.h代码如下
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "led.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::Widget *ui;
Led *led;//定义一个led对象
};
#endif // WIDGET_H
widget.cpp代码如下
#include "widget.h"
#include "ui_widget.h"
#include "led.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
led=new Led(this);//new对象
//led->filename="C:\\Users\\Administrator\\Desktop\\test.txt";
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()//槽函数
{
led->led_on();
}
void Widget::on_pushButton_2_clicked()
{
led->led_off();
}
2.方式2
#ifndef LED_H
#define LED_H
#include <QObject>
#include <QDebug>
#include <QString>
#include <QByteArray>
#include <QFile>
#define LED_ON 0x01
#define LED_OFF 0x00
#define LED1_BRIGHTNESS "/dev/led"
class led : public QObject
{
Q_OBJECT
public:
explicit led(QObject *parent = nullptr);
int initLed(void);
int readLed(void);
int wrtieLed(int on_off);
signals:
};
#endif // LED_H
#include "led.h"
#include <QString>
#include <QFile>
led::led(QObject *parent) : QObject(parent)
{
}
int led::initLed(void)
{
QFile led1_file(LED1_BRIGHTNESS);
if(!led1_file.open(QIODevice::ReadWrite))
{
return -1;
}
led1_file.close();
return 0;//成功
}
int led::readLed(void)
{
int ret;
QFile led1_file(LED1_BRIGHTNESS);
if(!led1_file.open(QIODevice::ReadWrite))
{
return -1;
}
QString str=led1_file.readAll();
ret=(str.toInt()!=0)?1:0;
led1_file.close();
return ret;
}
int led::wrtieLed(int on_off)
{
QFile led1_file(LED1_BRIGHTNESS);
if(!led1_file.open(QIODevice::ReadWrite))
{
return -1;
}
QTextStream out(&led1_file);
out<<on_off;
led1_file.close();
return 0;
}
#include "widget.h"
#include "ui_widget.h"
#include "led.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
led1=new led();
if(led1->initLed()==0)
{
int led_on_off=led1->readLed();
if(led_on_off==1)
{
}
}
else //初始化失败,表示文件不存在,设置按钮不可用
{
ui->pushButton->setEnabled(false);
ui->pushButton_2->setEnabled(false);
}
}
Widget::~Widget()
{
delete ui;
}
3.完善
led类的构造函数,析构函数,以及析构顺序
4.指定按键为回车
ui->pushButton->setShortcut(tr("Return"));