说明:本来想尝试做一个红外按键控制QT界面控件选中的,因为windows中pushbutton有三种状态,一种是常态,一种是光标停靠态还有一种是停靠态,想的是通过移动光标使pushbutton处于光标停靠状态来表示pushbutton被选中的,但是程序编译好在板子上跑,通过红外按键确实实现了光标移动,但是光标移动到相应控件上,控件并没有像windows上那样出现处于光标停靠态的效果。
但想着实现了红外按键控制QT界面的光标移动也算是一种进步,就顺便记录下,已方便有同类似需求的人做一个参考。
**********************************************************************RFslect.pro******************************************
#-------------------------------------------------
#
# Project created by QtCreator 2018-05-15T18:50:25
#
#-------------------------------------------------
QT += core gui
widget.cpp
widget.h
********************************************************widget.h********************************************************
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
void initIO(void);
void set_ui(void);
void keyPressEvent(QKeyEvent * k);
private slots:
void keyreadyread();
private:
QSocketNotifier *notifier; //红外读监听
// QString * device;
int fd; //文件描述符
static int flag; //按键按下记录标志
QPoint * curentpiont; //用于获取当前鼠标的坐标,也用于设置坐标改变
QPushButton * p1;
QPushButton * p2;
QPushButton * p3;
QPushButton * p4;
QPushButton * p5;
QPushButton * p6;
QPushButton * p7;
QHBoxLayout * layout1;
QHBoxLayout * layout2;
};
#endif // WIDGET_H
***************************************************main.cpp***************************************************************
#include "widget.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
*************************************************widget.cpp***************************************************************
#include "widget.h"
#include
int Widget::flag = 0;
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
curentpiont = new QPoint;
*curentpiont = cursor().pos(); //获取当前光标所在位置
qDebug()<
set_ui(); //程序界面设置
}
Widget::~Widget()
{
if(this->fd>= 0)
::close(this->fd);
}
void Widget::initIO()
{
this->fd= open("/dev/input/event0", O_RDONLY); //打开红外按键设备
if(this->fd< 0)
{
qDebug()<<"open file erro"<
}
this->notifier = new QSocketNotifier(this->fd, QSocketNotifier::Read, this); //监听读
connect(this->notifier, SIGNAL(activated(int)), this, SLOT(keyreadyread())); //如果读到的有数据则映射判断
}
void Widget::set_ui()
{
p1 = new QPushButton("p1");
p1->setFixedSize(50,100);
p2 = new QPushButton("p2");
p2->setFixedSize(50,100);
p3 = new QPushButton("p3");
p3->setFixedSize(50,100);
p4 = new QPushButton("p4");
p4->setFixedSize(50,100);
p5 = new QPushButton("p5");
p5->setFixedSize(50,100);
layout1 = new QHBoxLayout;
layout1->addWidget(p1);
layout1->addSpacerItem(new QSpacerItem(30,30));
layout1->addWidget(p2);
layout1->addSpacerItem(new QSpacerItem(30,30));
layout1->addWidget(p3);
layout1->addSpacerItem(new QSpacerItem(30,30));
layout1->addWidget(p4);
layout1->addSpacerItem(new QSpacerItem(30,30));
layout1->addWidget(p5);
setLayout(layout1);
}
void Widget::keyPressEvent(QKeyEvent *k)
{
if(k->key() == Qt::Key_Up)
{
qDebug()<<"up is active"<
QCursor::setPos(*curentpiont); //重新设定光标位置
}
if(k->key() == Qt::Key_Down)
{
qDebug()<<"down is active"<
QCursor::setPos(*curentpiont);
}
if(k->key() == Qt::Key_Left)
{
qDebug()<<"left is active"<
QCursor::setPos(*curentpiont);
}
if(k->key() == Qt::Key_Right)
{
qDebug()<<"right is active"<
qDebug()<
}
if(k->key() == Qt::Key_Enter)
{
qDebug()<<"ok is active"<
}
//红外键值捕获
void Widget::keyreadyread()
{
struct input_event t; //红外数据接收结构体
if(read(fd,&t,sizeof(t))<0)
{
return;
}
Qt::KeyboardModifiers modifiers = Qt::NoModifier;
int unicode = 0x0000; //unicode 用于保存映射之后的字符
int keycode = 0; //keycode用于保存映射之后的Qt::Key类型的键值
switch(t.code)
{
case 0x67: keycode = Qt::Key_Up; break;
case 0x6c: keycode = Qt::Key_Down; break;
case 0x69: keycode = Qt::Key_Left; break;
case 0x6a: keycode = Qt::Key_Right; break;
case 0x160: keycode = Qt::Key_Enter; break;
default:return;
}
if(1 == t.value ) //因为红外按键存在抖动问题,故每按下两次计数一次,来消除抖动
{
flag++;
}
if(2 == flag)
{
flag = 0;
QKeyEvent keyPressEvent(QEvent::KeyPress, keycode, Qt::NoModifier);
QGuiApplication::sendEvent(this, &keyPressEvent); //发射按键事件
}
}