Chinaunix首页 | 论坛 | 博客
  • 博客访问: 410113
  • 博文数量: 62
  • 博客积分: 1483
  • 博客等级: 上尉
  • 技术积分: 779
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-24 12:25
文章分类

全部博文(62)

文章存档

2012年(2)

2011年(6)

2010年(6)

2009年(48)

我的朋友

分类: LINUX

2009-11-29 22:04:37

qt的按键代码

hello.h---------------------------------
#include
#include
#include
#include
#include
#include
#include
#include
#include

class myMainWindow : public QWidget
{
    Q_OBJECT
    public:
        myMainWindow();
        ~myMainWindow();
    public slots:
        void getKey();
    private:
        void paintEvent(QPaintEvent *);
        QPainter *painter;
        int fd;
        QLabel *label;
        QTimer *readPress;
        bool keyStat[6];
};

hello.cpp---------------------------
#include "hello.h"


#include
#include
#include
#include
#include
#include
#include


myMainWindow::myMainWindow()
{

    setBackgroundColor(green);
    setMinimumSize(200,150);
    setMaximumSize(200,150);

    for(int i=0;i<6;i++)
    keyStat[i] = 0;        //6个按键全设置为未按下状态

    label = new QLabel(this);
    label->setGeometry(20,20,200,40);
    label->setBackgroundColor(green);
    label->setFont(QFont("Times",15,QFont::Black));
    label->setText("the six rectangle show\n"
                    "key pressed or not");
    label->setAlignment(AlignLeft);


    readPress = new QTimer(this); //使用q版定时器,问题就解决了。
    connect(readPress,SIGNAL(timeout()),this,SLOT(getKey()));
    readPress->start(10); //开始

    fd = open("/dev/buttons", O_NONBLOCK); //只能在这里打开一次,不然中断会丢失,这是驱动程序的结果
    if (fd < 0) {
        perror("open device buttons");
        exit(1);
    }
}

myMainWindow::~myMainWindow()
{
    ::close(fd);
}

void myMainWindow::paintEvent(QPaintEvent *)
{
#define WIDTH 50
#define LEN 30

    int i;
    painter = new QPainter(this);
    painter->begin(this);
    painter->setBrush(QBrush(blue,0)); //设置在那个画矩形的前面,之后画出的矩形都是用这个颜色填充
    for(i=0;i<6;i++){
        if(keyStat[i] == 1) //按下时使用新的画刷
        painter->setBrush(QBrush(blue,SolidPattern));

        if(i<3){
            painter->drawRoundRect(20+i*WIDTH,60,WIDTH,LEN,40,40);
        }
        else {
            painter->drawRoundRect(20+(i-3)*WIDTH,60+LEN,WIDTH,LEN,40,40);
        }
    painter->setBrush(QBrush(blue,0)); //默认的是这个透明的画刷
    }
    painter->end();
}

void myMainWindow::getKey()
{
    readPress->stop();

    int ret;
    int key_value[6]={0,};

    ret = read(fd, key_value, sizeof key_value);

    if (ret != sizeof key_value){
        puts("no press\n");
        goto out;
    }

    for(int i=0;i<6;i++){
        if(key_value[i] & 0x80)keyStat[i]=false;
        else if(key_value[i]) keyStat[i]=true;
        else continue;
    }
    erase();
    update();
out:
    readPress->start(10);
}

int main(int argc,char **argv)
{
    QApplication a(argc,argv);
    myMainWindow w;
    a.setMainWidget(&w);
    w.show();
    a.exec();
}


阅读(3733) | 评论(0) | 转发(0) |
0

上一篇:qt qpainter 画鼠标轨迹[转]

下一篇:读写24c08

给主人留下些什么吧!~~