Qt 键盘的设计和使用

使用界面

  • 1.数字键盘
    数字键盘
  • 2.拼音键盘
    拼音键盘

需求

在arm平台有时候需要用户需要数据,因为arm平台没有外接键盘设计,需要设计虚拟键盘来实现功能,当用户点击界面输入控件(比如QLineEdit,QtextEdit 等)的时候自动弹出虚拟键盘,实现用户输入功能。

实现机制

使用Qt的事件机制来实现,当发生鼠标点击事件的时候,判断当前光标所在的object的属性值,如果是已经注册属性值,将会调出输入键盘,同时获取当前object的内容,并且将当前光标焦点保存下来,当关闭键盘的时候,将键盘中输入的内容拷贝到object的输入框中。
整个代码使用简单,与应用程序的耦合度小,可交叉编译使用在嵌入式平台。如果使用放有自己的定制键盘放到键盘管理工厂类中来时间调用。

主要代码讲解

//键盘工厂类,负责调用键盘和增加键盘
keyBoardFactory.cpp


//这里可以增加使用方自定义的键盘
void KeyboardFactory::init()
{
    //添加两种使用键盘
    DigitalBoard *board = new DigitalBoard;
    hzKB* hzkeyBoard  = new hzKB;


    addKeyboard("DigitalBoard", board);
    addKeyboard("pingyin",hzkeyBoard);
}

void KeyboardFactory::addKeyboard(const QString &name, IKeyboard *kb)
{
    auto it = m_keyboards.find(name);
    if (it != m_keyboards.end())
    {
        if (it.value() != NULL)
        {
            delete it.value();
        }
    }
    m_keyboards[name] = kb;
}

//鼠标单击事件
bool KeyboardFactory::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::MouseButtonPress)
    {
        if(qApp->focusWidget() != NULL)
        {
            //获取焦点的属性值
            QString kbType = qApp->focusWidget()->property ("Keyboard").toByteArray();
            QString regExp = qApp->focusWidget()->property("setRegExp").toByteArray();
            if (!kbType.isEmpty())
            {
                //根据焦点属性值去查找键盘
                auto it = m_keyboards.find(kbType);

                if (it != m_keyboards.end())
                {
                    it.value()->setRegExp(regExp);
                    it.value()->setCurrentFocus(qApp->focusWidget());
                    it.value()->focusChanged();
                    it.value()->showBoard();

                }
            }
        }
    }
    return QObject::eventFilter(obj, event);
}
class IKeyboard
//工厂类

    class IKeyboard
            :public QWidget
    {
        Q_OBJECT

    public:
        IKeyboard(QWidget* parent=0, Qt::WindowFlags f=Qt::WindowFlags());

    public:
        //具体的键盘去实现数据更新
        virtual void focusChanged() = 0;
        virtual void showBoard();
        virtual void hideBoard();

    public:
        void setOldFocus(QWidget *focus);
        //当前鼠标的焦点
        void setCurrentFocus(QWidget *focus);
        //设置正则表达式
        void setRegExp(const QString &arg);

    protected:
        void mousePressEvent(QMouseEvent *e);
        void mouseMoveEvent(QMouseEvent *e);

    private:
        void moveToScreenCenter();

    protected:
        QWidget *m_oldFocus;
        QWidget *m_currentFocus;
        QString regExp;
        QPoint m_currentPosition;
    };

以下代码是具体的使用,在使用的时候我们需要对每个输入的控件进行属性设置,包括正则表达式的设置,这样,我们在使用的时候,才能正确的加载我们需要的键盘。

mainwindow.cpp
void MainWindow::init()
{
    ui->Text_numEdit->setProperty(keyboardKye,numKeyboardValue);

    ui->line_numEdit->setProperty (keyboardKye,numKeyboardValue);
    //设置正则表达式,控制具体使用
    ui->line_numEdit->setProperty (setRegExp,"(\d)(\.\d{1,4})?");
    //调用中文输入键盘
    ui->Text_pinyinEdit->setProperty (keyboardKye,PINYIN);
}

main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
    Nut::KeyboardFactory key;

    MainWindow w;
    w.show();

    Nut::KeyboardFactory key;


    return a.exec();
}

UML类图

UML类图

github地址

源码地址

发表评论

电子邮件地址不会被公开。 必填项已用*标注