一、功能介绍
能打开设备文件 进行操作
用label显示灯的两种状态
二、代码
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QFile>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
/* 属性 */
private:
QVBoxLayout *vLayout;
QLabel *labShowLed; // 显示led图片
QPushButton *btnOnOffLed; // 按键led开灭
// QFile ledDevFile; // led的设备文件
bool ledstate; // led的状态
/* 函数 */
private:
void initWidget(); // 初始化窗口
/* 槽函数 */
private slots:
void SltBtnOnOffClicked(); // 按键点击槽函数
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QMessageBox>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
initWidget(); // 初始化窗口
// ledDevFile.setFileName("/dev/gpioled"); // 获取led设备文件
ledstate = false; // led状态为灭
}
Widget::~Widget()
{
}
/**
* @brief Widget::initWidget
* 初始化界面
*/
void Widget::initWidget()
{
this->setGeometry(0,0,800,480);
vLayout = new QVBoxLayout(this);
labShowLed = new QLabel();
labShowLed->setPixmap(QPixmap(":/images/led_off.png"));
btnOnOffLed = new QPushButton("On/Off");
/* 添加到布局 */
QHBoxLayout *hLayout = new QHBoxLayout();
QWidget *hWidget = new QWidget();
QSpacerItem *hSpacer0 = new QSpacerItem(300, 480, QSizePolicy::Minimum, QSizePolicy::Maximum);
hLayout->addSpacerItem(hSpacer0);
hLayout->addWidget(labShowLed);
hLayout->addSpacerItem(hSpacer0);
hWidget->setLayout(hLayout);
vLayout->addWidget(hWidget); // 添加标签
vLayout->addWidget(btnOnOffLed); // 添加按键
/* 按键点击槽函数 */
connect(btnOnOffLed,SIGNAL(clicked()),this,SLOT(SltBtnOnOffClicked()));
}
/**
* @brief SltBtnOnOffClicked
* 开关灯 按键点击槽函数
*/
void Widget::SltBtnOnOffClicked()
{
char const *filename = "/dev/gpioled"; // 可执行文件名
int fd,ret; // fd: 文件句柄 ret:函数操作返回值
unsigned char databuf[1]; // 缓冲区
/* 打开LED文件 */
fd = open(filename, O_RDWR); // 可读可写
if(fd < 0){ // 打开文件错误
QMessageBox::information(this,"提示","打开文件失败");
::close(fd); // 关闭文件
return ;
}
// 判断led的状态
if(ledstate){
databuf[0] = 0;
ledstate = false;
labShowLed->setPixmap(QPixmap(":/images/led_on.png"));
}
else{
databuf[0] = 1;
ledstate = true;
labShowLed->setPixmap(QPixmap(":/images/led_off.png"));
}
/* 向文件中写入数据 */
ret = write(fd, databuf, sizeof(databuf));
if(ret < 0){
::close(fd); // 关闭文件
}else{ // 写入成功
}
/* 关闭文件 */
::close(fd);
// if(!ledDevFile.exists()){ // 文件不存在
// QMessageBox::information(this,"提示","设备文件不存在");
// return ;
// }
// /* 以读写方式打开文件 */
// if(!ledDevFile.open(QIODevice::ReadWrite)){
// QMessageBox::information(this,"提示","打开文件失败");
// return ;
// }
// ledstate = !ledstate; // LED状态翻转
// if(ledstate){ // 开
// ledDevFile.write("0"); // 写入命令
// labShowLed->setPixmap(QPixmap(":/images/led_on.png"));
// }else{ // 关
// ledDevFile.write("1"); // 写入命令
// labShowLed->setPixmap(QPixmap(":/images/led_off.png"));
// }
// /* 关闭文件 */
// ledDevFile.close();
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
三、运行
在ubuntu上打开会提示文件不存在