1、从QInputContext派生自己的InputContext类 ,例如:

class MyInputPanelContext : public QInputContext
    {
        Q_OBJECT

public:
        MyInputPanelContext();
        ~MyInputPanelContext();

/* 事件过滤器 */

bool filterEvent(const QEvent* event);

QString identifierName();
        QString language();

bool isComposing() const;

void reset();

private slots:

/* 槽用于接收从输入面板输入的字符 */
        void sendCharacter(QChar character);

private:
        void updatePosition();

private:

/* 关联的输入面板 */
        MyInputPanel *inputPanel;
    };

MyInputPanelContext::MyInputPanelContext()
   {

/* 创建和输入法关联的面板 */
        inputPanel = new MyInputPanel;

/* 并将characterGenerated和sendCharacter关联,当用户按键后,则继续由sendCharacter向目标Widget */
        connect(inputPanel, SIGNAL(characterGenerated(QChar)), SLOT(sendCharacter(QChar)));
    }

bool MyInputPanelContext::filterEvent(const QEvent* event)
    {
        if (event->type() == QEvent::RequestSoftwareInputPanel)

{

/* 当某个Widget请求软键盘输入时,显示软键盘 */
            updatePosition();
            inputPanel->show();
            return true;
        }

else if (event->type() == QEvent::CloseSoftwareInputPanel)

{

/* 当某个Widget请求关闭软键盘输入时,关闭软键盘 */
           inputPanel->hide();
          return true;
        }
        return false;
    }

void MyInputPanelContext::sendCharacter(QChar character)
    {
        QPointer<QWidget> w = focusWidget();

if (!w)
            return;

/* 当收到按键面板的按键输入后,分别向当前焦点Widget发送KeyPress和KeyRelease事件 */

QKeyEvent keyPress(QEvent::KeyPress, character.unicode(), Qt::NoModifier, QString(character));
        QApplication::sendEvent(w, &keyPress);

if (!w)
            return;

QKeyEvent keyRelease(QEvent::KeyPress, character.unicode(), Qt::NoModifier, QString());
        QApplication::sendEvent(w, &keyRelease);
    }

/* 根据当前焦点Widget的位置,调整输入面板的位置 */

void MyInputPanelContext::updatePosition()
    {
        QWidget *widget = focusWidget();
        if (!widget)
            return;

QRect widgetRect = widget->rect();
        QPoint panelPos = QPoint(widgetRect.left(), widgetRect.bottom() + 2);
        panelPos = widget->mapToGlobal(panelPos);
        inputPanel->move(panelPos);
    }

2、输入面板

图示:

/* 每个按钮具有一个buttonValue动态属性,表明和该按钮相关的字符,当按钮点击时,将此字符作为信号参数发出 */

/* 前面的InputContext关联了此信号,并进一步发送给了目标Widget */

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

3、使用InputContext

在应用程序main处,通过setInputContext将InputContext和Application关联,入:

int main(int argc, char **argv)
    {
        QApplication app(argc, argv);

MyInputPanelContext *ic = new MyInputPanelContext;

/* InputContext和Application关联 */

app.setInputContext(ic);

/* 主窗口 */

QWidget widget;
        Ui::MainForm form;
        form.setupUi(&widget);
        widget.show();

return app.exec();
}

qt软键盘输入的更多相关文章

  1. Android - 隐藏EditText弹出的软键盘输入(SoftInput)

    隐藏EditText弹出的软键盘输入(SoftInput) 本文地址: http://blog.csdn.net/caroline_wendy 保持界面的整洁, 能够选择在进入界面时, 隐藏EditT ...

  2. Android软键盘调用及隐藏,以及获得点击软键盘输入的字母信息

    在Android提供的EditText中单击的时候,会自动的弹出软键盘,其实对于软键盘的控制我们可以通过InputMethodManager这个类来实现.我们需要控制软键盘的方式就是两种一个是像Edi ...

  3. QT软键盘

    如何实现鼠标单击弹出软键盘 默认情况下,如果当前编辑框无焦点,则需要鼠标点击两次才弹出软键盘,其中第一次是让该编辑框获得焦点,第二次点击才弹出软键盘: 如果当前编辑框已经获得焦点,则点击一次就会弹出软 ...

  4. Qt 获取键盘输入

    void vc_widget::keyPressEvent(QKeyEvent *ev) { if (ev->key() == Qt::Key_Up) { qDebug() << & ...

  5. Android开发:在EditText中关闭软键盘 转来的

    1.EditText有焦点(focusable为true)阻止输入法弹出 editText=(EditText)findViewById(R.id.txtBody); editText.setOnTo ...

  6. Android软键盘与输入框的设置

    大家开发Android或者用app的时候会发现转到输入框就会自动弹出软键盘,切换别的页面就会自动的隐藏,下面几行代码用的熟练了就行了: 1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) I ...

  7. Android开发UI之手动显示和隐藏软键盘

    1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Contex ...

  8. Android 手动显示和隐藏软键盘

    1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Contex ...

  9. 软键盘 输入法管理器 InputMethodManager

     基本介绍 软键盘的显示原理 软键盘其实是一个Dialog.InputMethodService为我们的输入法创建了一个Dialog,并且对某些参数进行了设置,使之能够在底部或者全屏显示.当我们点击输 ...

随机推荐

  1. float 和 real

      用于表示浮点数值数据的大致数值数据类型.浮点数据为近似值:因此,并非数据类型范围内的所有值都能精确地表示. 注意: real 的 SQL-92 同义词为 float(24). 数据类型 范围 存储 ...

  2. 133. Clone Graph

    题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...

  3. Android WebView 开发详解(一)

    转载请注明出处  http://blog.csdn.net/typename/article/details/39030091 powered by meichal zhao 概览: Android ...

  4. lib 合并

    方法1: 命令如下:lib.exe lib1.lib lib2.lib ... /out:hw.lib 另一种合并的方法: 思路:lib.exe 可以把lib文件里的obj文件取出来,然后把这些obj ...

  5. Java之String,StringBuffer,StringBuilder类

    在 java 语言中, 用来处理字符串的的类常用的有 3 个: String.StringBuffer.StringBuilder. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2 ...

  6. C++11 中的线程、锁和条件变量

    转自:http://blog.jobbole.com/44409/ 线程 类std::thread代表一个可执行线程,使用时必须包含头文件<thread>.std::thread可以和普通 ...

  7. Android启动时间测试方法

    android apk启动时间可以通过下面的命令来完成测试,最终会生成一个mp4的视屏文件,通过播放录制好的视屏来统计app的启动时间精确到ms级别   例如:adb shell screenreco ...

  8. BZOJ_1622_[Usaco2008_Open]_Word_Power_名字的能量_(字符匹配_暴力)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1622 给出多个文本串和模式串,求每个文本串中有多少模式串. 分析 直接暴力... #inclu ...

  9. Chrome 控制台console的用法(学了之后对于调试js可是大大有用的哦)

    大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的,因为它对于调试脚本及前端设计调试都有它比其它浏览器有过之而无不及的地方.可能大家对co ...

  10. 面试准备--Spring(IoC)

    Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. 1.IoC:控制反转(Inversion of Control)是一个重要的面向对象编 ...