zoukankan      html  css  js  c++  java
  • Qt4 inputpanel 升级改造

    转载:https://blog.csdn.net/Q1302182594/article/details/48847311?locationNum=14

    背景

        Qt4源码中提供了一个inputpanel例程,包含了一个数字虚拟键盘,如下图所示。本文的目的在于将其改造成支持英文字符输入的键盘。

        图1 inputpanel效果图

    2 添加按键

        由图1可见,inputpannel只有数字键,因为我们需要添加英文字母按键。通过查看属性发现,图1中的数字键都是使用QPushButton来创建,因此我们也使用它来实现英文字符键。这里以a键为例进行说明。a键的QPushButton对象名设置为panelButton_a。

        需要注意的是,panelButton_a的focusPolicy属性默认为StrongFocus,这里要将其改为NoFocus,否则键盘不能正常弹出。

     图2.1 QPushButton focusPolicy设置

    2.1 信号设置

    signalMapper.setMapping(form.panelButton_a, form.panelButton_a);
    connect(form.panelButton_a, SIGNAL(clicked()),
                &signalMapper, SLOT(map()));

    3 键字值读取方式

    3.1 inputpanel默认方式——动态属性

        inputpanel默认获取按键对应字符的方式是获取按键的动态属性buttonValue。这个属性默认并不存在,需要程序员手动添加。选中QPushButton,然后在属性编辑栏点击“+”键创建动态属性,属性类型选择“其它”(如图3.1)然后在弹出来的图3.2中详细设置。

       图3.1 添加动态属性

       图3.2 动态属性设置

       接下来就是设置具体的属性值。对按键a,应该将其值设置为a,如下图:

                图3.3 动态属性值

      获取按键buttonValue属性代码如下所示:

    void MyInputPanel::buttonClicked(QWidget *w)
    {
    QChar chr = qvariant_cast<QChar>(w->property("buttonValue"));
    emit characterGenerated(chr);
    }

    3.2 我修改的方式——QPushButton::text()

        上述方式只适用于可打印字符,然而在键盘中还有其它控制字符是不可打印的。同时,在大小写之间进行切换时需要同时修改buttonValue值,非常不方便。这里,我将其改为直接读取QPushButton的text值。代码如下所示:

    QString str = ((QPushButton*)w)->text();
    QChar chr = str.at[0];

    4 特殊按键处理

        这里以Backspace键为例进行说明。

        要删除前一个字符《Qt Virtual Keyboard》2.3小节介绍的widgetKeyboard中使用的方法是先将QLineEdit中的内容读到一个临时的QString变量中,然后删除这个临时变量的最后一个字符,最后将这个处理过的变量setText到QLineEdit上。这种方法的效率是很低的。

        这里,将采用一种新的方法:触发一个Backspace按键事件即可!为了达到这个目的,需要对inputpanel的下面函数进行修改:

    void MyInputPanelContext::sendCharacter(QChar character);
    void MyInputPanel::characterGenerated(QChar character);

     主要就是将上述函数的参数类型都改为int,如下所示:

    void MyInputPanel::characterGenerated(int key); // key接受参数为字符的unicode码
    void MyInputPanelContext::sendCharacter(int key)
    {
        QPointer<QWidget> w = focusWidget();
     
     
        if (!w)
            return;
     
        QKeyEvent keyPress(QEvent::KeyPress, key, Qt::NoModifier, QString(key));
        QApplication::sendEvent(w, &keyPress);
    }

    修改了上述信号和槽,同时也需要修改连接方式:

    connect(inputPanel, SIGNAL(characterGenerated(int)), SLOT(sendCharacter(int)));

       为了对Backspace键进行特殊处理,修改buttonClicked()函数如下:

    void MyInputPanel::buttonClicked(QWidget *w)
    {
        int key;
        QString str = ((QPushButton*)w)->text();
        if (str == "Backspace") {
            key = Qt::Key_Backspace;
     
        }
        else {
            QChar chr = ((QPushButton*)w)->text().at(0);
            key = chr.unicode();
        }
     
        emit characterGenerated(key);
    }

    5 效果及源码

        最后效果如下图:

      源码:点击这里下载。

    参考资料

    [1]QT 软键盘

    [2]Catching bacspace press event on QT



  • 相关阅读:
    LeetCode 32. 最长有效括号(Longest Valid Parentheses)
    LeetCode 141. 环形链表(Linked List Cycle)
    LeetCode 160. 相交链表(Intersection of Two Linked Lists)
    LeetCode 112. 路径总和(Path Sum)
    LeetCode 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)
    LightGBM新特性总结
    sql service 事务与锁
    C#泛型实例详解
    C# 中的委托和事件(详解)
    C# DateTime日期格式化
  • 原文地址:https://www.cnblogs.com/sggggr/p/12733430.html
Copyright © 2011-2022 走看看