您的位置:首页 > 编程语言 > Qt开发

[转载]Qt 软键盘[模拟]之键盘触发事件

2013-04-09 17:11 776 查看
关键词:键盘触发事件、QList用法、清除/获得焦点、CSS、Qt初学教程

1、打开Qt Creater软件,在'File'菜单中选择'New File or Project..'选项,弹出的对话框如下所示:



2、选择 Qt C++ Project -->Qt Gui Project ,然后单击'Choose..',进入下面的界面后,Base Class选择QWidget,然后单击 Next :



3、进入下面的界面,输入Name ,单击 Next ,再单击 Finished 即可:



4 、双击左侧树状菜单里的QWidget.ui,



5、计入界面设计,设计如下:


(这是程序运行之后的效果)

其中,按钮的objectName都重新设置,如下所示:



6、双击树状菜单中的QWidget.h,编写头文件如下:

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include <QDebug>

#include<QKeyEvent>

#include <QList>

#include <QPushButton>

#include <QStyle>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget(QWidget *parent = 0);

~Widget();

protected:

void keyPressEvent(QKeyEvent *k);

private:

Ui::Widget *ui;

QList<QPushButton*> list;

QList<QPushButton*>::iterator i;

private slots:

void init();//初始化

QList<QPushButton*> uniteAllBtn(); //将所有按钮放到List中

void upKeyEvent(QPushButton*);

void getBtnFocus(int num);

void zeroBtnClicked();

void oneBtnClicked();

void twoBtnClicked();

void threeBtnClicked();

void fourBtnClicked();

void fiveBtnClicked();

void sixBtnClicked();

void sevenBtnClicked();

void eightBtnClicked();

void nineBtnClicked();

void backBtnClicked();

void clearClicked();

//键盘上下键事件

void keyUp();

void keyDown();

void keyLeft();

void keyRight();

};

#endif // WIDGET_H

7、widget.cpp

//----------------------------------------------------

#include "widget.h"#include "ui_widget.h"

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

this->init();

list = this->uniteAllBtn();

}

Widget::~Widget()

{

delete ui;

}

//初始化槽函数

void Widget::init()

{

connect(ui->zeroBtn,SIGNAL(clicked()),this,SLOT(zeroBtnClicked()));

connect(ui->oneBtn,SIGNAL(clicked()),this,SLOT(oneBtnClicked()));

connect(ui->twoBtn,SIGNAL(clicked()),this,SLOT(twoBtnClicked()));

connect(ui->threeBtn,SIGNAL(clicked()),this,SLOT(threeBtnClicked()));

connect(ui->fourBtn,SIGNAL(clicked()),this,SLOT(fourBtnClicked()));

connect(ui->fiveBtn,SIGNAL(clicked()),this,SLOT(fiveBtnClicked()));

connect(ui->sixBtn,SIGNAL(clicked()),this,SLOT(sixBtnClicked()));

connect(ui->sevenBtn,SIGNAL(clicked()),this,SLOT(sevenBtnClicked()));

connect(ui->eightBtn,SIGNAL(clicked()),this,SLOT(eightBtnClicked()));

connect(ui->nineBtn,SIGNAL(clicked()),this,SLOT(nineBtnClicked()));

connect(ui->backBtn,SIGNAL(clicked()),this,SLOT(backBtnClicked()));

connect(ui->clearBtn,SIGNAL(clicked()),this,SLOT(clearClicked()));

}

//将所有按钮装入一个Qlist中

QList<QPushButton*> Widget::uniteAllBtn()

{

QList<QPushButton*> list;

list.append(ui->zeroBtn);

list.append(ui->oneBtn);

list.append(ui->twoBtn);

list.append(ui->threeBtn);

list.append(ui->fourBtn);

list.append(ui->fiveBtn);

list.append(ui->sixBtn);

list.append(ui->sevenBtn);

list.append(ui->eightBtn);

list.append(ui->nineBtn);

list.append(ui->backBtn);

list.append(ui->clearBtn);

return list;

}

//单击‘0’按钮触发的事件

void Widget::zeroBtnClicked()

{

ui->lineEdit->setText(ui->lineEdit->text()+"0");

getBtnFocus(0);

ui->zeroBtn->setStyleSheet("QPushButton:pressed{background-color:

rgb(255, 55,15);}");

}

//单击‘1’按钮

void Widget::oneBtnClicked()

{

ui->lineEdit->setText(ui->lineEdit->text()+"1");

getBtnFocus(1);

}

//单击'2'按钮

void Widget::twoBtnClicked()

{

ui->lineEdit->setText(ui->lineEdit->text()+"2");

getBtnFocus(2);

}

//单机'3'按钮

void Widget::threeBtnClicked()

{

ui->lineEdit->setText(ui->lineEdit->text()+"3");

getBtnFocus(3);

}

//4

void Widget::fourBtnClicked()

{

ui->lineEdit->setText(ui->lineEdit->text()+"4");

getBtnFocus(4);

}

//5

void Widget::fiveBtnClicked()

{

ui->lineEdit->setText(ui->lineEdit->text()+"5");

getBtnFocus(5);

}

//6

void Widget::sixBtnClicked()

{

ui->lineEdit->setText(ui->lineEdit->text()+"6");

getBtnFocus(6);

}

//7

void Widget::sevenBtnClicked()

{

ui->lineEdit->setText(ui->lineEdit->text()+"7");

getBtnFocus(7);

}

//8

void Widget::eightBtnClicked()

{

ui->lineEdit->setText(ui->lineEdit->text()+"8");

getBtnFocus(8);

}

//9

void Widget::nineBtnClicked()

{

ui->lineEdit->setText(ui->lineEdit->text()+"9");

getBtnFocus(9);

}

//退格键

void Widget::backBtnClicked()

{

QString s = ui->lineEdit->text();

int len = s.length();

QString s2 = s.remove(len-1,1);

qDebug()<<s2;

ui->lineEdit->setText(s2);

getBtnFocus(10);

}

//清空

void Widget::clearClicked()

{

getBtnFocus(11);

ui->lineEdit->setText("");

}

//获取焦点

void Widget::getBtnFocus(int num)

{

int j=0;

for(i=list.begin(); i!=list.end(); ++i)

{

QPushButton *btn = *i;

if(num == j)

{

btn->setFocus();

btn->setStyleSheet("background-color: rgb(255, 55, 15);");

}

else

{

btn->clearFocus();

btn->setStyleSheet("");

}

j++;

}

}

//键盘事件

void Widget::keyPressEvent(QKeyEvent *k)

{

switch(k->key()){

case Qt::Key_8:

keyUp();

break;

case Qt::Key_2:

keyDown();

break;

case Qt::Key_4:

keyLeft();break;

case Qt::Key_6:

keyRight();break;

}

}

//按键盘的上键触发的事件

void Widget::keyUp()

{

int j=0; //判断是否到最后一个

for(i=list.begin(); i!=list.end(); ++i)

{

// qDebug() << list.size();

QPushButton *btn = *i;

if(btn->hasFocus())

{

btn->clearFocus();

if(j<list.size()-1){

QPushButton *btn1 = *(++i);

btn1->setFocus();

}

else

{ //当焦点到list最后一个时

QPushButton *btn1 = *(list.begin());

btn1->setFocus();

}

}

j++;

}

}

void Widget::keyDown()

{

int j=0; //判断是否到最后一个

for(i=list.begin(); i!=list.end(); ++i)

{

QPushButton *btn = *i;

if(btn->hasFocus())

{

btn->clearFocus();

if(j==0)

{ //当焦点到list第一个时

QPushButton *btn2 = *(--list.end());

qDebug()<<btn2->objectName();

btn2->setFocus();

}

else

{

QPushButton *btn1 = *(--i);

btn1->setFocus();

}

}

j++;

}

}

void Widget::keyLeft()

{

keyUp();

}

void Widget::keyRight()

{

keyUp();

}

8、main.cpp不用做修改

#include <QtGui/QApplication>

#include "widget.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

Widget
w;

w.show();

return a.exec();

}

//--------------------------------- the end -----------------------------------

转载于:http://blog.sina.com.cn/s/blog_5f08aea00100pkar.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: