Qt实战开发-数字软键盘

开发的思路

  • 布局键盘界面
  • 每一个button对应一个槽函数
  • 把输入的字符返回到点击处的文本编辑框

    开发过程

  • 首先定义功能button,在头文件中定义

    QString getText();
    QPushButton *num6Button;
    QPushButton *backspaceButton;
    QPushButton *num4Button;
    QPushButton *okButton;
    QPushButton *leftButton;
    QPushButton *num1Button;
    QPushButton *cancelButton;
    QPushButton *rightButton;
    QPushButton *num9Button;
    QPushButton *num8Button;
    QPushButton *num2Button;
    QPushButton *num7Button;
    QPushButton *dotButton;
    QPushButton *num3Button;
    QPushButton *num0Button;
    QPushButton *num5Button;
    QPushButton *signButton;
    QLineEdit *lineEdit;

接着定义相关联的槽函数

    void on_num1Button_clicked();
    void on_num2Button_clicked();
    void on_num3Button_clicked();
    void on_num4Button_clicked();
    void on_num5Button_clicked();
    void on_num6Button_clicked();
    void on_num7Button_clicked();
    void on_num8Button_clicked();
    void on_num9Button_clicked();
    void on_dotButton_clicked();
    void on_num0Button_clicked();
    void on_signButton_clicked();
    void on_leftButton_clicked();
    void on_rightButton_clicked();
    void on_backspaceButton_clicked();
    void on_cancelButton_clicked();
    void on_okButton_clicked();

下面定义界面布局显示的功能模块

        okButton = new QPushButton(this);
        okButton->setText(" OK");
        okButton->setGeometry(QRect(190, 250, 110, 50));
        QFont font1;
        font1.setPointSize(14);
        okButton->setFont(font1);

        backspaceButton = new QPushButton(this);
        backspaceButton->setText(" backspace");
        backspaceButton->setGeometry(QRect(190, 130, 110, 50));
        backspaceButton->setFont(font1);

        num6Button = new QPushButton(this);
        num6Button->setText("6");
        num6Button->setGeometry(QRect(130, 130, 50, 50));
        QFont font;
        font.setPointSize(22);
        num6Button->setFont(font);

        num4Button = new QPushButton(this);
        num4Button->setText(" 4");
        num4Button->setGeometry(QRect(10, 130, 50, 50));
        num4Button->setFont(font);

        leftButton = new QPushButton(this);
        leftButton->setText("<-");
        leftButton->setGeometry(QRect(190, 190, 50, 50));
        leftButton->setFont(font);

        num1Button = new QPushButton(this);
        num1Button->setText("1");
        num1Button->setGeometry(QRect(10, 70, 50, 50));
        num1Button->setFont(font);

        cancelButton = new QPushButton(this);
        cancelButton->setText("Esc");
        cancelButton->setGeometry(QRect(190, 70, 110, 50));
        cancelButton->setFont(font1);

        rightButton = new QPushButton(this);
        rightButton->setText("->");
        rightButton->setGeometry(QRect(250, 190, 50, 50));
        rightButton->setFont(font);

        num9Button = new QPushButton(this);
        num9Button->setText("9");
        num9Button->setGeometry(QRect(130, 190, 50, 50));
        num9Button->setFont(font);

        num8Button = new QPushButton(this);
        num8Button->setText("8");
        num8Button->setGeometry(QRect(70, 190, 50, 50));
        num8Button->setFont(font);

        num2Button = new QPushButton(this);
        num2Button->setText("2");
        num2Button->setGeometry(QRect(70, 70, 50, 50));
        num2Button->setFont(font);

        num7Button = new QPushButton(this);
        num7Button->setText("7");
        num7Button->setGeometry(QRect(10, 190, 50, 50));
        num7Button->setFont(font);

        dotButton = new QPushButton(this);
        dotButton->setText(".");
        dotButton->setGeometry(QRect(130, 250, 50, 50));
        dotButton->setFont(font);


        num3Button = new QPushButton(this);
        num3Button->setText("3");
        num3Button->setGeometry(QRect(130, 70, 50, 50));
        num3Button->setFont(font);

        num0Button = new QPushButton(this);
        num0Button->setText("0");
        num0Button->setGeometry(QRect(10, 250, 50, 50));
        num0Button->setFont(font);

        num5Button = new QPushButton(this);
        num5Button->setText("5");
        num5Button->setGeometry(QRect(70, 130, 50, 50));
        num5Button->setFont(font);

        signButton = new QPushButton(this);
        signButton->setText("+/-");
        signButton->setGeometry(QRect(70, 250, 50, 50));
        QFont font2;
        font2.setPointSize(20);
        signButton->setFont(font2);

        lineEdit = new QLineEdit(this);
        lineEdit->setGeometry(QRect(10, 10, 290, 50));
        QFont font3;
        font3.setPointSize(24);
        font3.setWeight(50);
        lineEdit->setFont(font3);
        lineEdit->setText(QString());

相应的槽函数功能

void NumKeyboard::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        break;
    default:
        break;
    }
}

bool NumKeyboard::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress)
    {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if (obj == lineEdit)
            {
                if(keyEvent->key() >= 0x20 && keyEvent->key()<= 0x0ff)  
                    return true;
                else
                    return false;
            }
            else
            {
                return false;
            }
    }
    else
    {
            // standard event processing
        return QObject::eventFilter(obj, event);
    }
}

//***********************按键*****************************//
void NumKeyboard::on_num1Button_clicked()       //1
{
    int idx = lineEdit->cursorPosition();  
    if(strContent.left(idx) == "0")       
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }

    strContent.insert(idx, '1'); 
    lineEdit->setText(strContent); 
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus(); 
    qDebug()<<"strContent"<<strContent;
    qDebug()<<"idx"<<idx;
}

void NumKeyboard::on_num2Button_clicked()       //2
{
    int idx = lineEdit->cursorPosition();
    if(strContent.left(idx) == "0")
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    strContent.insert(idx, '2');
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_num3Button_clicked()       //3
{
    int idx = lineEdit->cursorPosition();
    if(strContent.left(idx) == "0")
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    strContent.insert(idx, '3');
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_num4Button_clicked()       //4
{
    int idx = lineEdit->cursorPosition();
    if(strContent.left(idx) == "0")
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    strContent.insert(idx, '4');
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_num5Button_clicked()       //5
{
    int idx = lineEdit->cursorPosition();
    if(strContent.left(idx) == "0")
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    strContent.insert(idx, '5');
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_num6Button_clicked()       //6
{
    int idx = lineEdit->cursorPosition();
    if(strContent.left(idx) == "0")
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    strContent.insert(idx, '6');
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_num7Button_clicked()       //7
{
    int idx = lineEdit->cursorPosition();
    if(strContent.left(idx) == "0")
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    strContent.insert(idx, '7');
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_num8Button_clicked()       //8
{
    int idx = lineEdit->cursorPosition();
    if(strContent.left(idx) == "0")
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    strContent.insert(idx, '8');
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_num9Button_clicked()       //9
{
    int idx = lineEdit->cursorPosition();
    if(strContent.left(idx) == "0")
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    strContent.insert(idx, '9');
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_dotButton_clicked()        //.
{
    int idx = lineEdit->cursorPosition();

    if(idx==0 || strContent.contains('.'))
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }

    strContent.insert(idx, '.');
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_num0Button_clicked()       //0
{
    int idx = lineEdit->cursorPosition();
    if(strContent.left(idx) == "0" || (idx==0 &&strContent!=""))
    {
        lineEdit->setCursorPosition(idx);
        qDebug()<<"idx"<<idx;
        lineEdit->setFocus();
        return;
    }
    strContent.insert(idx, '0');
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_signButton_clicked()       //+/-
{
    int idx = lineEdit->cursorPosition();
    if(strContent.left(1) == "-")
    {
        strContent.remove(0, 1);
        lineEdit->setText(strContent);
        lineEdit->setCursorPosition(idx-1);
        lineEdit->setFocus();
    }
    else
    {
        if(strContent=="0" || strContent=="")
        {
            lineEdit->setCursorPosition(idx);
            lineEdit->setFocus();
        }
        else
        {
            strContent.insert(0, '-');
            lineEdit->setText(strContent);
            lineEdit->setCursorPosition(idx+1);
            lineEdit->setFocus();
        }
    }
}

void NumKeyboard::on_leftButton_clicked()       //left
{
    int idx = lineEdit->cursorPosition();
    if(idx == 0)
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    lineEdit->setCursorPosition(idx-1);
    lineEdit->setFocus();
}

void NumKeyboard::on_rightButton_clicked()      //right
{
    int idx = lineEdit->cursorPosition();
    if(idx == strContent.length()) //返回此字符串的字符数
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();
}

void NumKeyboard::on_backspaceButton_clicked()      //backspace
{
    int idx = lineEdit->cursorPosition();
    if(idx == 0)
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    strContent.remove(idx-1,1);
    lineEdit->setText(strContent);
    lineEdit->setCursorPosition(idx-1);
    lineEdit->setFocus();
}

void NumKeyboard::on_cancelButton_clicked()     //cancel
{
    this->close();
    valid = false;
}

void NumKeyboard::on_okButton_clicked()         //ok
{
    this->close();
    valid = true;
}

void NumKeyboard::setText(QString str)      //设置文本内容
{
    strContent = str;
    lineEdit->setText(strContent);
    lineEdit->setFocus();
}

QString NumKeyboard::getText()              //获取内容
{
    return strContent;
}

上面的槽函数中只对大体的相似,只对不同处做出讲解
以点击“1”为例:
获取在软键盘中的文本框中光标的位置,赋值给idx,索引用

int idx = lineEdit->cursorPosition();  

官方的解释如下
QString x = “Pineapple”;
QString y = x.left(4); // y == “Pine”
同理下面的代码含义是:把当前光标位置左侧所有的数,存放在strContent中,
if判断的作用是,当数值开头是0,便不能够输入。一个简单的检查的功能,例如无法输入”01“

insert的官方解释
QString str = “Meal”;
str.insert(1, QString(“ontr”));
// str == “Montreal”
下面语句的作用是在当前的坐标处出插入1;把新的字符串返回给strContent
(初始时idx=0,光标位置是0)
strContent.insert(idx, ‘1’);
随后设置当前的光标的位置+1,
lineEdit->setCursorPosition(idx+1);
显示光标
lineEdit->setFocus();

void NumKeyboard::on_num1Button_clicked()       //1
{
    int idx = lineEdit->cursorPosition();  
    if(strContent.left(idx) == "0")       
    {
        lineEdit->setCursorPosition(idx);
        lineEdit->setFocus();
        return;
    }
    strContent.insert(idx, '1');  
    lineEdit->setText(strContent); 
    lineEdit->setCursorPosition(idx+1);
    lineEdit->setFocus();  

}

在设置正负的时候还会用到 strContent.remove(0, 1);
官方的解释是:
QString s = “Montreal”;
s.remove(1, 4);
// s == “Meal”
上面的含义是,在0的位置删除1个字符。就是数字前面的+、-

在设置右移的槽函数中
idx == strContent.length()) //返回此字符串的字符数

最后通过getText() 函数获取文本的内容

QString NumKeyboard::getText() //获取内容
{
return strContent;
}

void SoftKeyLineEdit::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton)
    {
        numkeyboard->setText(this->text());  
        numkeyboard->exec();
        if(numkeyboard->valid)
        {
            this->setText(numkeyboard->getText());  
        }
    }
}

我们通过鼠标点击的方式来触发软键盘
下面的函数的作用是:把当前的文本框中的内容传递给软件盘中的文本框
numkeyboard->setText(this->text());
下面的exec()与show()显示的方式有所不同。
exec():
显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。
show():
显示一个非模式对话框。控制权即刻返回给调用函数。
numkeyboard->exec();
如果点击“确认”按键后 valid返回值是true
if(numkeyboard->valid)

随后把返回得到的字符串,传递到点击处的文本框中。
this->setText(numkeyboard->getText());

如何快速一个上面的软键盘到项目中
1.包含上面的cpp和.h文件
2.通过触发的方式触发下面语句
numkeyboard->setText(this->text());
numkeyboard->exec();
if(numkeyboard->valid)
{
this->setText(numkeyboard->getText());
}
3.触发方式可以是信号(例如clicked())
另外看还可以是mousePressEvent(); 它的使用方式要重写
细节(QString 定义的strContent存储有引用计数,指向相同的存储空间,仅仅 是增加一个引用计数)

效果图

这里写图片描述

源代码下载
http://download.csdn.net/detail/osean_li/9773460

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值