软键盘_软键盘输入 - CSDN
精华内容
参与话题
  • 漂亮软键盘 源代码

    2020-07-29 14:20:28
    漂亮软键盘 源代码
  • 一体机软键盘

    2020-07-28 23:33:35
    有些精简系统没有软键盘,可安装这个软件,调出软键盘后可直接使用。
  • Qt5软键盘实现中文拼音输入法

    万次阅读 热门讨论 2017-11-10 21:17:24
    基于Qt实现的虚拟键盘实现输入法在网上所有资料看来,几乎都是基于生成的中文汉字数据库实现的方法,不够灵活,不够智能。 拼音输入法的库我们采用的安卓底层的谷歌拼音输入法,在Qt5.7之后,Qt官方也出了一款输入法...

    一、序

    基于Qt实现的虚拟键盘实现输入法在网上所有资料看来,几乎都是基于生成的中文汉字数据库实现的方法,不够灵活,不够智能。

    二、实现

    1、拼音输入法的库

    我们采用的安卓底层的谷歌拼音输入法,在Qt5.7之后,Qt官方也出了一款输入法(支持中文拼音输入),但是是基于QML设计的,我们拿到其源码发现,其中的拼音输入法实现也是拿了安卓底层的谷歌拼音。

    一定要记住:在有轮子的情况下,我们千万不要自己造轮子,除非迫不得已。我们把源码剥离出来,C++实现的,Qt官方稍微修改了几行代码,可以直接用在Qt上。我们单独把谷歌拼音输入法编译成静态库,到时候实现软键盘的时候直接链接进去。

    googlepinyin.pro 
    QT       -= gui
    TARGET = googlepinyin
    TEMPLATE = lib
    CONFIG += staticlib
    SOURCES += \
        dictbuilder.cpp \
        dictlist.cpp \
        dicttrie.cpp \
        lpicache.cpp \
        matrixsearch.cpp \
        mystdlib.cpp \
        ngram.cpp \
        pinyinime.cpp \
        searchutility.cpp \
        spellingtable.cpp \
        spellingtrie.cpp \
        splparser.cpp \
        sync.cpp \
        userdict.cpp \
        utf16char.cpp \
        utf16reader.cpp
    HEADERS += \
        atomdictbase.h \
        dictbuilder.h \
        dictdef.h \
        dictlist.h \
        dicttrie.h \
        lpicache.h \
        matrixsearch.h \
        mystdlib.h \
        ngram.h \
        pinyinime.h \
        searchutility.h \
        spellingtable.h \
        spellingtrie.h \
        splparser.h \
        sync.h \
        userdict.h \
        utf16char.h \
        utf16reader.h
    

    工程源码在这里googlepinyin.7z,大家可以自行下载研究。对外提供的接口在pinyinime.h文件里面。

    2、实现软件盘

    先看一张实现的软件盘截图。
    软件截图

    软键盘插件实现框架网上资料很多,不做赘述。
    我的源码工程目录如下:
    源码工程目录

    dict:存放最后要使用的二进制字典文件,此字典文件是谷歌拼音输入法根据最原始的汉字文件生成的,大家到时候直接使用就行了,不用深究此处。
    font:存放图标字体,FontAwesome.otf。Font Awesome 是一款可缩放的矢量图标字库。相信很多人对这个感到陌生,请大家自行搜索FontAwesome,以及如何在Qt中运用FontAwesome。
    images:按钮图片背景。
    pinyin:刚才编译出来的谷歌拼音库和头文件。
    googlepinyin.h,googlepinyin.cpp:谷歌拼音库的接口使用文件。
    keyboardform.h,keyboardform.cpp:键盘布局文件。
    keyeventdispacher.h,keyeventdispacher.cpp:键盘按键的事件处理文件。
    inputcontext.,platforminputcontextplugin.,Qt5Input.json,virtualkeyborad_global.h:这几个文件不做赘述。
    res.qrc:资源文件

    工程文件中难点不多,不再对源码进行解释。

    编译这个工程VritualKeyboard.7z,最后生成的是一个动态链接库,但是如何使用呢?

    3、使用软键盘

    • 假设要使用输入法的程序是QtDemo.exe;
    • 在Qt5Demo.exe所在目录新建一个文件夹 platforminputcontexts (文件夹名称不可更改成其他),将 VirtualKeyboard.dll放入其中;
    • 将工程目录中 dict 整个文件夹复制到Qt5Demo.exe所在目录;
    • 最后运行QtDemo.exe 即可。
      测试目录

    三、总结

    1、不要重复造轮子。
    2、在Qt的工程中使用Font Awesome图标字体。
    3、学习使用输入法插件的模板工程。
    4、学习谷歌拼音输入法的使用。

    四、感谢

    1. 感谢QTCN上的各位大神
    2. 感谢全球最大的同性交友网站GitHub

    完美收官

    展开全文
  • 软键盘问题汇总

    2016-04-13 18:16:37
    软键盘在Android中是重要的输入设备,如果我们对其进行友好化优化的话,对提高用户体验有大大的帮助。

    软键盘在Android中是重要的输入设备,如果我们对其进行友好化优化的话,对提高用户体验有大大的帮助。

    1. InputMethodManager

    InputMethodManager是软键盘的管理类,我们可以用它来控制软键盘的展开、隐藏等操作。

    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
     //隐藏软键盘
     imm.hideSoftInputFromWindow(getActivity().getWindow().getDecorView().getWindowToken(), 0);
     //切换键盘
      if(imm.isActive()){                 imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,InputMethodManager.HIDE_NOT_ALWAYS);
     }

    2. windowSoftInputMode

    WindowSoftInputMode是控制软键盘的启动模式,一般在theme 或者manifest中设置

    描述
    stateUnspecified 软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。这个是为了软件盘行为默认的设置。
    stateUnchanged 软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。
    stateHidden 当用户选择该Activity时,软键盘被隐藏——也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。
    stateAlwaysHidden 软键盘总是被隐藏的,当该Activity主窗口获取焦点时
    stateVisible 软键盘是可见的,当那个是正常合适的时(当用户导航到”Activity主窗口时)
    stateAlwaysVisible 当用户选择这个Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。
    adjustUnspecified 它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为设置。
    adjustResize 该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间
    adjustPan 该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。

    解决Andriod软键盘出现把原来的布局给顶上去的方法

    //在mainfest.xml中,对那个Activity加:
    <activity android:name=".activity.HomeActivity"
              android:windowSoftInputMode="adjustPan|stateHidden"/>

    3.WindowManager.LayoutParams.softInputMode

    WindowManager.LayoutParams.softInputMode 是Window上的属性,当设置其属性时,如果之前在主题上设置上windowSoftInputMode将会override。如果采用其他许多办法无法关闭显示软键盘,可以设置WindowManager.LayoutParams.softInputMode,将会起到想不到的好效果

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    softInputMode 描述
    SOFT_INPUT_MASK_STATE 软输入区域是否可见
    SOFT_INPUT_STATE_UNSPECIFIED 未指定状态
    SOFT_INPUT_STATE_UNCHANGED 不要修改软输入法区域的状态
    SOFT_INPUT_STATE_HIDDEN 隐藏输入法区域(当用户进入窗口时)
    SOFT_INPUT_STATE_ALWAYS_HIDDEN 当窗口获得焦点时,隐藏输入法区域。
    SOFT_INPUT_STATE_VISIBLE 显示输入法区域(当用户进入窗口时)
    SOFT_INPUT_STATE_ALWAYS_VISIBLE 当窗口获得焦点时,显示输入法区域
    SOFT_INPUT_MASK_ADJUST 窗口应当主动调整,以适应软输入窗口
    SOFT_INPUT_ADJUST_UNSPECIFIED 未指定状态,系统将根据窗口内容尝试选择一个输入法样式
    SOFT_INPUT_ADJUST_RESIZE 当输入法显示时,允许窗口重新计算尺寸,使内容不被输入法所覆盖。不可与SOFT_INPUT_ADJUSP_PAN混合使用;如果两个都没有设置,系统将根据窗口内容自动设置一个选项
    SOFT_INPUT_ADJUST_PAN 输入法显示时平移窗口。它不需要处理尺寸变化,框架能够移动窗口以确保输入焦点可见。不可与SOFT_INPUT_ADJUST_RESIZE混合使用;如果两个都没有设置,系统将根据窗口内容自动设置一个选项。
    SOFT_INPUT_IS_FORWARD_NAVIGATION 当用户转至此窗口时,由系统自动设置,所以你不要设置它。当窗口显示之后该标志自动清除

    4.InputType

    我们使用EditText有时为了提高用户体验,在弹出软键盘时需要设置键盘的面板状况,有时需要展示中文键盘,数字键盘,英文键盘等等。
    可以设置InputType。EditText的InputType可以输入两种类型,一种EditorInfo,一种是InputType。EditorInfo是InputType实现类
    Android并没有提供设置默认的输入状态的接口,但我们可以通过如下方法一样能够达到想要的效果:
    InputType可以在Xml设置,或者直接在代码中设置。
    默认数字键盘

    mEditText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

    默认中文键盘

    mEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT);

    默认英文键盘

    mEditText.setInputType(EditorInfo.TYPE_TEXT_VARIATION_URI);

    5.ImeOption

    改变输入法中回车按钮的显示内容,如果回车按钮是执行搜索功能,则回车按钮上显示”搜索”,如果是执行发送功能,则显示”发送”,如果是下一步,则显示”下一步”。

    /**
    *
    * IME_ACTION_SEARCH 搜索
    * IME_ACTION_SEND 发送
    * IME_ACTION_NEXT 下一步
    * IME_ACTION_DONE 完成
    */
    mInputEditTxt.setImeOptions(EditorInfo.IME_ACTION_SEARCH);

    6.关闭软键盘的N中方法

    • 方式一:InputMethodManager
     EditText edit=(EditText)findViewById(R.id.edit);  
               InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
               imm.hideSoftInputFromWindow(edit.getWindowToken(),0);
    • 方式一:InputMethodManager
    EditText edit=(EditText)findViewById(R.id.edit);
               edit.clearFocus();
    • 方式三:InputType 默认EditText始终不弹出软键盘
    EditText edit=(EditText)findViewById(R.id.edit);
           edit.setInputType(InputType.TYPE_NULL);

    7.KEYCODE

    在软键盘输入中我们需要监听我们按的键,我们可以用OnkeyListener监听按键。例如
    KeyEvent.KEYCODE_Z、KeyEvent.KEYCODE_ENTER等按键。

        mInputEditTxt.setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
                    System.out.println("手指弹起时执行确认功能");
                    return true;
                }
                return false;
            }
        });
    展开全文
  • 软键盘弹出顶起布局的小技巧

    千次阅读 2019-11-05 10:06:20
    在安卓开发中我们会很频繁的和软键盘打交道,但是软键盘本来是不属于我们的布局的,它的出现会遮挡布局,比如,布局中有一个EditText是位于底部的,点击之后弹出软键盘,如果我们不做任何处理,那软键盘必然会将...

    在安卓开发中我们会很频繁的和软键盘打交道,但是软键盘本来是不属于我们的布局的,它的出现会遮挡布局,比如,布局中有一个EditText是位于底部的,点击之后弹出软键盘,如果我们不做任何处理,那软键盘必然会将EditText遮挡,这是很糟糕的效果,该怎么避免呢?

    首先我想到了Activity的windowSoftInputMode属性,这个属性能影响两件事情:
    1、当有焦点产生时,软键盘是隐藏还是显示
    2、是否改变活动主窗口大小以便腾出空间展示软键盘
    它有以下值可以设置:
    1、stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
    2、stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
    3、stateHidden:用户选择activity时,软键盘总是被隐藏
    4、stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
    5、stateVisible:软键盘通常是可见的
    6、stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
    7、adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
    8、adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
    9、adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖,并且用户总能看到输入内容的部分
    可以设置一个或多个,多个之间用|分开。这些值中符合我们要求的是adjustResize和adjustPan。先看adjustPan,它会将当前获取了焦点的EditText之上的布局整体上移,以此来达到EditText不被软键盘覆盖的目的。但如果我只想让EditText和与EditText有关的一些控件上移,而它们之上的控件保持不变呢?OK,这时候我们就需要用到adjustResize,但是光用它还是不够的,还需要我们的布局配合。

    我的需求如下:
    1、布局的上半部分放一个视频播放器,可以实现简单的视频播放功能;
    2、布局的下半部分有包括EditText在内的布局
    3、点击EditText,要求包括EditText在内的布局均被软键盘顶起,而视频播放的布局不被挤压

    实现效果如下
    这里写图片描述

    本人技术粗糙,布局写的不太好,但基本效果算是实现了(这里有用到点击EditText外部,隐藏键盘的小技巧,想要理解的请移步我的另一篇博客http://blog.csdn.net/k_bb_666/article/details/78805971),还有需要优化的地方,希望各位看官多提意见!直接上代码吧!
    1、在清单文件中给相应的Activity设置windowSoftInputMode属性

    		<activity
                android:name=".activity.VideoPublishActivity"
                android:screenOrientation="portrait"
                android:windowSoftInputMode="adjustResize|stateHidden" />
    

    2、布局文件

    <?xml version="1.0" encoding="utf-8"?>
    //最外层必须是RelativeLayout,才能保证布局被顶起
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff"
        tools:context="com.daishu.copperman.activity.VideoPublishActivity">
    	//软键盘弹出时,这个布局不动,且视频播放正常,不被挤压变形
    	//这层套FrameLayout是为了防止播放视频的布局被挤压
    	<FrameLayout 
            android:id="@+id/fl_video_play"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    		//我在这里动态添加了播放器
            <RelativeLayout 
                android:id="@+id/rl_video_play"
                android:layout_width="match_parent"
                android:layout_height="360dp"
                android:background="#f2f2f2">
            </RelativeLayout>
        </FrameLayout>
    	//以下是需要被软键盘顶起的布局
        <LinearLayout
            android:id="@+id/ll_bottom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true" //想要顶起的布局必须居于底部
            android:background="#fff"
            android:orientation="vertical">
    
            <EditText
                android:id="@+id/et_publish_title"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:background="@null"
                android:gravity="start"
                android:hint="请输入标题(30字以内)" />
    
            <com.zhy.view.flowlayout.TagFlowLayout
                android:id="@+id/id_flowlayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginTop="15dp"
                zhy:max_select="1" />
    
            <Button
                android:id="@+id/btn_publish"
                style="?android:attr/borderlessButtonStyle"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="3"
                android:background="@drawable/shape_publish_btn"
                android:gravity="center"
                android:text="发布"
                android:textColor="#2e2e2e"
                android:textSize="14sp" />
        </LinearLayout>
     </RelativeLayout>
    

    我们总结一下(敲黑板!划重点!)
    1、最外层布局必须是相对布局RelativeLayout(保证只顶起部分布局,而不是将整个界面上移);
    2、需要在承载视频播放器的布局外套一层FrameLayout(保证布局顶起时视频不被挤压);
    3、将想要顶起的布局居于底部(保证此部分布局被全部顶起);

    做到这三点就可以简单实现软键盘弹出,将布局顶起,且不挤压视频播放的效果了,本人文笔不好,且技术比较糙,希望写下的东西能帮助到大家!也希望大家多提意见!谢谢!

    展开全文
  • QT 软键盘实现

    2019-08-02 21:19:21
    在树莓派下面运行了一下我的写的代码,发现在输入框中并不能使用键盘输入内容,什么都不能输入,只能自己实现软键盘。 QT 的事件处理: Qt 程序需要在main()函数创建一个QCoreApplication对象 然后调用它的...

     

    在树莓派下面运行了一下我的写的代码,发现在输入框中并不能使用键盘输入内容,什么都不能输入,只能自己实现软键盘。

     

    QT 的事件处理:

    1. Qt 程序需要在main()函数创建一个QCoreApplication对象
    2. 然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。
    3. 在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。
    • 当事件发生时:
    1. Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent
    2. 在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。

    如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。

    参考链接

    • 鼠标事件

    使用的时候,加头文件:#include <QMouseEvent>

        void mousePressEvent(QMouseEvent *event);        //单击
        void mouseReleaseEvent(QMouseEvent *event);      //释放
        void mouseDoubleClickEvent(QMouseEvent *event);  //双击
        void mouseMoveEvent(QMouseEvent *event);         //移动
        void wheelEvent(QWheelEvent *event);             //滑轮

     

    // 鼠标按下事件
    void Widget::mousePressEvent(QMouseEvent *event)
    {
        // 如果是鼠标左键按下   改变指针形状,并且存储当前指针位置与窗口位置的差值。
        if(event->button() == Qt::LeftButton){
            ···
        }
        // 如果是鼠标右键按下
        else if(event->button() == Qt::RightButton){
           ···
        }
    }
    // 鼠标移动事件       默认情况下,触发事件需要点击一下,才能触发。可设置为自动触发:setMouseTracking(true); 
    
    
    void Widget::mouseMoveEvent(QMouseEvent *event)
    {
        // 这里必须使用buttons()
        if(event->buttons() & Qt::LeftButton){  //进行的按位与
           ···
        }
    }
    
    
    // 鼠标释放事件
    void Widget::mouseReleaseEvent(QMouseEvent *event)
    {
       ···
    }
    
    
    // 鼠标双击事件
    void Widget::mouseDoubleClickEvent(QMouseEvent *event)
    {
        // 如果是鼠标左键按下
        if(event->button() == Qt::LeftButton){
          
            ···
        }
    }
    
    
    // 滚轮事件
    void Widget::wheelEvent(QWheelEvent *event)
    {
        // 当滚轮远离使用者时
        if(event->delta() > 0){
            ···
        }else{//当滚轮向使用者方向旋转时
            ···
        }
    }
    
    • 键盘事件:

     

    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *event);
    键盘事件使用时,加头文件
    
    #include <QKeyEvent>
    
    // 键盘按下事件
    void Widget::keyPressEvent(QKeyEvent *event)
    {
        // 是否按下Ctrl键      特殊按键
        if(event->modifiers() == Qt::ControlModifier){
            // 是否按下M键    普通按键  类似
            if(event->key() == Qt::Key_M)
                ···
        }
        else QWidget::keyPressEvent(event);   //保存默认事件
    
        //如果是处理两个普通按键,得避免自动重复,释放中也要处理
        if(event->key() == Qt::Key_Up){
            // 按键重复时不做处理
            if(event->isAutoRepeat()) return;
            // 标记向上方向键已经按下
            keyUp = true;
        }else if(event->key() == Qt::Key_Left){
            if(event->isAutoRepeat()) return;
            keyLeft = true;
        }
    
    }
    
    
    // 按键释放事件
    void Widget::keyReleaseEvent(QKeyEvent *event)
    {
        ···
    	
        //如果是处理两个普通按键,得避免自动重复
       if(event->key() == Qt::Key_Up){
            if(event->isAutoRepeat()) return;
     
     	···       
           
        }
        else if(event->key() == Qt::Key_Left){
            if(event->isAutoRepeat()) return;
           ···
          
       }
    
    }
    
    • event filter是什么?

    EventFilter即所谓事件过滤器,在Qt中是一个比较重要的概念,它的功能是把所有事件在到达watchee(被监控者)之前全部传递给另一个watcher(监控者),由watcher先行处理并决定是否继续传递该事件,如果继续传递,则事件将回传给watchee来处理。 

    event filter的常见应用场合
    用来处理热键 -- 比如一个界面上可以由用户热键来触发的多个按钮。 由于只有得到焦点的控件才能获得键盘的事件, 如果不用event filter就需要给每个button都加上键盘事件的处理,还要在button里去访问兄弟button的指针,逻辑非常混乱。如果由主窗体做各个按钮的eventFilter,则只需要在主窗体里去处理键盘事件就好,而且主窗体可以很容易的访问到各个button的指针,很方便。

    用来代替派生和重写虚函数 -- Qt里的键盘鼠标事件基本上都是以虚函数的方式来处理,要想重写虚函数则必须派生一个子类,这样的话如果只是一个简单的事件处理也去派生子类代价未免大了些,这时候就值得用用eventFilter。比如我的MDI界面想在每个子窗体关闭的时候做一些统一的操作,一般的做法是处理子窗体的closeEvent。但显然给每个子窗体都去派生个子类太不现实,最好的方法是把mainwindow作为子窗体的eventFilter去处理CloseEvent事件。

    如何使用event filter处理事件?

    event filter的使用有点曲折,有两个步骤要做。

    • 1 调用watchee的installEventFilter以watcher指针为参数

    watchee->installEventFilter(watcher);
    • 2 在watcher的类中实现bool eventFilter(QObject*, QEvent*) 这个虚函数,在此函数中处理事件。

     class KeyPressEater : public QObject
    {
    Q_OBJECT
    ...
     
    protected:
    bool eventFilter(QObject *obj, QEvent *event);
    };
     
    bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
    {
    if (event->type() == QEvent::KeyPress) {
    QKeyEvent *keyEvent = static_cast(event);
    qDebug("Ate key press %d", keyEvent->key());
    return true;
    } else {
    // standard event processing
    return QObject::eventFilter(obj, event);
    }
    }

    其中几点需要注意的地方:
    - watchee和watcher必须都是从QObject派生的子类实例
    - watcher的类必须是一个自定义的子类(因为需要重新实现虚函数, 用现成的类是不行的。)
    watcher类的eventFilter函数返回true时表示该事件处理完毕,不再继续传递;返回false表示该事件仍然传递
    eventFilter的实现的最后必须调用watcher基类的eventFilter函数以传递事件。如果不调的话watcher的所有事件都将丢失。
    - 注意eventFilter的声明必须和文档里的一模一样, 写的时候注意返回值、大小写和参数类型

    在Qt中还有一些应用程序级别的eventFilter函数,是和平台相关的,如x11EventFilter可以截获程序得到的所有X事件。相应的Windows平台下用winEventFilter… 大家不要被函数的名字给误导了,这些函数并不是全局级别的,充其量只能拿到应用程序内部的事件,想做系统级别的事件过滤还是差着档次…

    点击LineEditdit弹出软键盘的方法

    • 在.h文件加入:

    public:
          KeyBoardDialog v_keyB;//键盘对话框
     
    private slots:
        bool eventFilter(QObject *,QEvent *);    //注意这里软件盘相关
    
    • 在.cpp文件构造函数中加入:

        ui->weightMaxlineEdit->installEventFilter(this);
    
    • 在.cpp中添加eventFilter函数的实现代码

    bool Widget::eventFilter(QObject *watched, QEvent *event)
    {
        if (watched==ui->weightMaxlineEdit)         //首先判断控件(这里指 lineEdit1)
        {
            if (event->type()==QEvent::FocusIn)     //然后再判断控件的具体事件 (这里指获得焦点事件)
            {
                QString ret = v_keyB.returnValue();//
                ui->weightMaxlineEdit->setText(ret);
                 //QMessageBox::information(this,tr("消息"),"复制完成");
                 ui->weightMaxlineEdit->clearFocus();//防止weightMaxlineEdit重新获得焦点再一次激发时间
            }
        }
     
         return QWidget::eventFilter(watched,event);     // 最后将事件交给上层对话框
    }
    

    软键盘的设计:

    思路:

    1 重写输入控件的mousePressEvent方法,在mousePressEvent方法中发射信号,并且将字符串发送出去,主窗口接收到信号后,打开相应的槽函数,在槽函数中打开软键盘界面,并且将信号发送过来的字符串显示在软键盘界面中。

    2 打开软键盘后,可以在界面上可以选择中英文输入法,如果是英文输入法,则直接显示出来,如果是中文输入法,则根据输入的英文字符来匹配字库中的字段,然后显示出来。

    3 点击软键盘返回按键,则发送信号,将字符串(英文或中文)发送给主窗口的输入组件并显示。

    • 分析:关键点。

    1、两个UI之间如何传数。2、软键盘应运行在何种状态能达到想要的效果。3、软键盘按键的槽如何写最简便的取数。

    解决:1、两个UI传数可以用函数返回值的方式,这个可以参看我的另一篇博文。具体的是在软键盘的程序中写一个returnvalue();返回输入完毕后输入的数,在主窗口函数中调用该函数,得到返回值。

     

    public:
    
    QString returnValue();//keyboard.h声明
    QString KeyBoard::returnValue()
    {
    exec();
    return inputBuf;
    }//keyboard.cpp返回输入值
    
    

     

    KeyBoard v_keyB(this);
    
    QString ret = v_keyB.returnValue();//mainwindow.cpp调用该函数,取得返回值
    • 2、exec();

    消息循环调用,它是软键盘成为模态对话框,模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。

    exec()程序进入消息循环,等待可能输入进行响应。这里main()把控制权转交给Qt,Qt完成事件处理工作,当应用程序退出的时候exec()的值就会返回。在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。done/reject/accept可以结束它。

    QString KeyBoard::returnValue()
    {
        exec();//消息循环
        return inputBuf;
    }//keyboard.cpp
    void KeyBoard::on_pushButton_yes_clicked()
    
    {
       KeyBoard v_keyB(this);
       inputBuf = StrBuf;
       if(inputBuf==""){inputBuf = "no_value";}
       int length = inputBuf.size();
       if(inputBuf[length-1]=='.')
       {
           inputBuf.remove(length-1,1);
       }
       done(2);
    }//keyboard.cpp按确认时则结束exec()
    • 3、利用字符串拼接方式是最简便的。

    void KeyBoard::on_pushButton_1_clicked()
    
    {
        m_ui->lineEdit_keyB->setText("");//清屏
        StrBuf += QString::number(1);//把字符1接到BUFFER中
        if(StrBuf[0] == '0'&&zero_flag==1&&StrBuf[1] != '.')
        {
            StrBuf.remove(0,1);
          }//判断0是否为首位,是首位且后无小数点则去掉
         m_ui->lineEdit_keyB->setText(StrBuf);
    
    }//显示

    QLineEdit信号总结:

    QLineEdit一共有6个信号函数,并不多,很好理解。

    ·void cursorPositionChanged( intold, intnew )

    当鼠标移动时发出此信号,old为先前的位置,new为新位置。

    · void editingFinished()

    当 按返回或者回车键时,或者行编辑失去焦点时,发出此信号。

    注意:当QLineEdit设置了validator() orinputMask()函数,验证器or输入掩码,并按了返回或回车键,信号只有在 输入内容符合输入掩码 或验证器返回 QValidator::Acceptable时 发出。

    · void returnPressed()

    当 返回或回车键按下时发出此信号,

    注意:当QLineEdit设置了validator() orinputMask()函数,验证器or输入掩码,并按了返回或回车键,信号只有在 输入内容符合输入掩码 或验证器返回 QValidator::Acceptable时 发出。

    · void selectionChanged()

    当选文本改变时,发出此信号。

    · void textChanged( const QString &text )

    当QLineEdit中的文本改变时,发出此信号,text是新的文本。当通过程序改变文本时,也会触发此信号,例如,setText()

    · void textEdited( const QString &text )

    当QLineEdit中的文本改变时,发出此信号,text是新的文本。当通过程序改变文本时,不会触发此信号。
    原文:https://blog.csdn.net/u013687602/article/details/19968185 
     

    展开全文
  • H5页面关闭软键盘

    万次阅读 2016-07-04 17:05:50
    H5页面关闭软键盘
  • Android 手动显示和隐藏软键盘

    万次阅读 多人点赞 2013-03-06 09:54:26
    1、方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_...
  • android弹出和关闭软键盘

    万次阅读 2018-08-21 16:35:20
    之前的写法有问题,这里记下免得以后再用错: ... * 显示键盘 * * @param et 输入焦点 */ public void showInput(final EditText et) { et.requestFocus(); InputMethodManager imm = (InputMethod...
  • html5自动弹出软键盘的方法

    千次阅读 2017-09-01 08:46:59
    html5自动弹出软键盘的方法 查看原文:http://newmiracle.cn/?p=2005
  • Android 软键盘自动弹出和关闭

    万次阅读 2016-05-10 16:24:35
    在我们写修改信息或者搜索,修改密码等界面的时候,用户进入这个界面的主要目的就是输入...1.软键盘的自动弹出private void showKeyboard(){ InputMethodManager inputMethodManager = (InputMethodManager) getSystem
  • 首先要在EditText的父布局中,设置两个属性. android:focusable="true" android:focusableInTouchMode="true"然后我写了一个方法,调用这个方法的时候,把EditText的id传进去就可以public void ...
  • js 移动端之监听软键盘弹出收起

    万次阅读 2018-03-15 16:51:04
    js 移动端关于页面布局,如果底部有position:fixed的盒子,又有input,当软键盘弹出收起都会影响页面布局。这时候Android可以监听resize事件,代码如下,而ios没有相关事件。var winHeight = $(window).height(); //...
  • 解决input框被软键盘弹出的 问题解决方案
  • android 弹不出软键盘的解决方法

    万次阅读 2012-09-11 16:56:30
    后来google+baidu终于解决了,我用的是getSystemService得到的WindowManager ,然后在这个WindowManager 里加的EditText,改为将EditText嵌套在activity的布局文件中就可以了,下面是不弹出软键盘的代码,你出的问题,不...
  • Android PopupWindow 与 软键盘 的遮挡问题解决

    万次阅读 热门讨论 2013-10-18 15:52:38
    PopupWindow含有输入框时,点击输入框,软键盘可能会挡住PopupWindow,而我们希望的是软键盘能够把PopupWindow给顶上去。 开始在网上查了不少资料,都没有一个能解决我的问题,于是自己动手多试了几个设置,误打误撞...
  • 如图![图片说明](https://img-ask.csdn.net/upload/201510/16/1444982773_595280.jpg... 因为要校验身份证,如果点击前往,就没法触发自己写的确认按钮事件,导致身份证没有校验,就直接提交表单了。请问有没有办法控制
  • Android软键盘弹出,界面整体上移

    万次阅读 2016-04-15 15:28:26
    现在问题出来了,android软键盘弹出的时候,android整个界面上移,布局被挤压,很难看;要解决这个问题,我们需要用到 windowSoftInputMode属性;参考:http://blog.csdn.net/twoicewoo/article/details/7384398 ...
  • 在点击文本框输入文字时,如何设置界面底部控件随着软键盘的弹出而上移……
  • Android手动显示和隐藏软键盘方法总结

    万次阅读 多人点赞 2017-07-03 10:26:05
    本文介绍Android中如何通过代码来显示和隐藏软键盘
1 2 3 4 5 ... 20
收藏数 67,063
精华内容 26,825
关键字:

软键盘