一、Qt程序
1. mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
/*
* file name:beep
* date: 2021-08-21 08:13
* version:1.0
* author:luatao
* describe:beep
*/
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
/* 按钮 */
QPushButton *pushButton;
/* 设置LED的状态 */
void setBeepState();
/* 获取LED的状态 */
bool getBeepState();
private slots:
/* 按键点击事件 */
void pushButtonClicked();
};
#endif // MAINWINDOW_H
2. mainwindow.cpp
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include "mainwindow.h"
#include <QDebug>
#include <QGuiApplication>
#include <QScreen>
#include <QRect>
/*
* file name:beep
* date: 2021-08-21 08:14
* version:1.0
* author:luatao
* describe:beep
*/
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/* 获取屏幕的分辨率 Qt官方建议使用这种方法设置屏幕分辨率
防止多屏设备导致对应不上,注意,这是获取整个桌面系统的分辨率*/
QList <QScreen *> list_screen = QGuiApplication::screens();
/* 如果是ARM平台,直接设置大小为屏幕的大小 */
#if __arm__
/* 重设大小 */
this->resize(list_screen.at(0)->geometry().width(),list_screen.at(0)->geometry().height());
#else
/* 否则则设置主窗体大小为 800x480 */
this->resize(800,480);
#endif
/* 实例化按键 */
pushButton = new QPushButton(this);
/* 按键居中显示 */
pushButton->setMinimumSize(200,50); // 设置按键的大小
pushButton->setGeometry((this->width() - pushButton->width())/2,
(this->height() - pushButton->height())/2,
pushButton->width(),pushButton->height()); // 设置按键的大小和位置
/* 获取Beep的状态 */
//getBeepState();
/* 信号槽连接 */
connect(pushButton, SIGNAL(clicked()),this, SLOT(pushButtonClicked()));
}
MainWindow::~MainWindow()
{
}
/* 设置Beep的状态 */
void MainWindow::setBeepState()
{
char const *filename = "/dev/miscbeep"; // 可执行文件名
int fd,ret; // fd: 文件句柄 ret:函数操作返回值
unsigned char databuf[1]; // 缓冲区
static bool state = false;
/* 在设置状态前先读取状态 */
// bool state = getBeepState();
/* 打开LED文件 */
fd = open(filename, O_RDWR); // 可读可写
if(fd < 0){ // 打开文件错误
::close(fd);
}
// 判断蜂鸣器的状态
if(state){
databuf[0] = 0;
state = false;
}
else{
databuf[0] = 1;
state = true;
}
/* 向文件中写入数据 */
ret = write(fd, databuf, sizeof(databuf));
if(ret < 0){
::close(fd);
}else{ // 写入成功
}
/* 关闭文件 */
::close(fd);
/* 重新获取Beep的状态 */
// getBeepState();
}
/* 获取Beep的状态 */
bool MainWindow::getBeepState()
{
char const *filename = "/dev/miscbeep"; // 可执行文件名
int fd,ret; // fd: 文件句柄 ret:函数操作返回值
char databuf[1]; // 缓冲区
/* 打开LED文件 */
fd = open(filename, O_RDWR); // 可读可写
if(fd < 0){ // 打开文件错误
::close(fd);
}
/* 读取文件所有数据 */
ret = read(fd, databuf, sizeof(databuf));
if (ret < 0) { // 读取文件失败
::close(fd);
}
/* 打印出读出的值 */
qDebug()<<"databuf:" <<databuf <<endl;
/* 关闭文件 */
::close(fd);
QString irValue = databuf;
if(irValue == "1"){ // 关闭Beep
pushButton->setText("light up");
return true;
}else{
pushButton->setText("extinguish");
return false;
}
}
/* 按键点击事件 */
void MainWindow::pushButtonClicked()
{
/* 反转Beep的状态 */
setBeepState();
}
二、运行效果
运行后在屏幕上显示一个按钮,通过点击按钮可以实现beep的状态的反转。