Qt 软键盘[模拟]之键盘触发事件
1、打開Qt?Creater軟件,在'File'菜單中選擇'New?File?or?Project..'選項(xiàng),彈出的對話框如下所示:
???????
?????2、選擇?Qt?C++?Project?-->Qt?Gui?Project?,然后單擊'Choose..',進(jìn)入下面的界面后,Base?Class選擇QWidget,然后單擊?Next?:
??????
????????
?????3、進(jìn)入下面的界面,輸入Name?,單擊?Next?,再單擊?Finished?即可:
???????
?????4?、雙擊左側(cè)樹狀菜單里的QWidget.ui,
????????
?????5、計(jì)入界面設(shè)計(jì),設(shè)計(jì)如下:
?????????(這是程序運(yùn)行之后的效果)??
?????其中,按鈕的objectName都重新設(shè)置,如下所示:
??????
??????
?????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;
?????}
???//初始化槽函數(shù)
?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’按鈕觸發(fā)的事件
???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);
??}
???//單機(jī)'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("");
?}
???//獲取焦點(diǎn)
???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;
??????}
}
//按鍵盤的上鍵觸發(fā)的事件
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
??????????{??//當(dāng)焦點(diǎn)到list最后一個時(shí)
??????????????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)
??????????{?//當(dāng)焦點(diǎn)到list第一個時(shí)
??????????????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();
???}
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的Qt 软键盘[模拟]之键盘触发事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt-导入第三方库
- 下一篇: Syszuxpin中文输入法移植