• 36235阅读
  • 30回复

如何实现软键盘(已找到例子) [复制链接]

上一主题 下一主题
离线duduqq
 

只看楼主 倒序阅读 楼主  发表于: 2008-08-03
— 本帖被 XChinux 执行加亮操作(2008-08-04) —
QT怎样实现软键盘
在一个窗体上有键盘的按钮,当按下相应的按钮时,相当于在键盘上按下那个键.如按下PgUp或者PgDn这样的键,浏览器的滚动条能向上或者向下移动.
要如何做?


PS:例子原代码http://www.qt-apps.org/content/show.php/QVKeyboard?content=77983


在LINUX下的软键盘我已实现很久了,有问题可以和我联系。
我还有个用软键盘控制键盘灯的问题没有解决,希望大家能一起探讨。
[ 此贴被duduqq在2009-01-13 16:50重新编辑 ]
离线mumutouv

只看该作者 1楼 发表于: 2008-08-04
我已经说过了怎么做了,你具体在这个论坛里面找找,相应的source code我也已经给了
离线xuyantao
只看该作者 2楼 发表于: 2008-08-04
的确应该首先搜索论坛的^_^
离线duduqq

只看该作者 3楼 发表于: 2008-08-06
各位,我搜过了,没有找到有啊
离线mumutouv

只看该作者 4楼 发表于: 2008-08-06
1.    XKeyEvent tsKeyboardWidget::createKeyEvent(Display *display, Window &win,
2.                             Window &winRoot, bool press,
3.                             int keycode, int modifiers)
4.    {
5.       XKeyEvent event;
6.      
7.       event.display    = display;
8.       event.window      = win;
9.       event.root        = winRoot;
10.       event.subwindow  = None;
11.       event.time        = CurrentTime;
12.       event.x          = 1;
13.       event.y          = 1;
14.       event.x_root      = 1;
15.       event.y_root      = 1;
16.       event.same_screen = TRUE;
17.       event.state      = modifiers;
18.       event.keycode    = XKeysymToKeycode(display,keycode);
19.       if(press)
20.           event.type = KeyPress;
21.       else
22.           event.type = KeyRelease;
23.    
24.       return event;
25.    }
26.    int tsKeyboardWidget::SendKeys(int keycode)
27.     {
28.       //modifier=pubModifier->text().toInt();
29.    // Obtain the X11 display.
30.       Display *display = XOpenDisplay(NULL);
31.       if(display == NULL)
32.           return -1;
33.    
34.    // Get the root window for the current display.
35.       Window winRoot;// = XRootWindow(display,1);
36.    
37.    // Find the window which has the current keyboard focus.
38.       Window winFocus;
39.       int revert=RevertToParent;
40.       //int RevertToParent=0;
41.       XGetInputFocus(display, &winFocus,&revert);
42.       //winFocus=winFocus+1;
43.    
44.    
45.    // Send a fake key press event to the window.
46.       XSelectInput(display, winFocus,FocusChangeMask|KeyPressMask|KeyReleaseMask);
47.       XMapWindow(display, winFocus);
48.    
49.       XKeyEvent event = createKeyEvent(display, winFocus, winRoot, true, keycode, modifier);
50.    
51.       XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
52.    
53.       event = createKeyEvent(display, winFocus, winRoot, false, keycode, modifier);
54.       XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
55.       XCloseDisplay(display);
56.       return 0;
57.    }
58.    void tsKeyboardWidget::btnA_clicked()
59.    {
60.       SendKeys(Qt::Key_A);
61.    
62.    }
上面是一段Qt向focus window发送XKeyEvent的代码,比较简单。
离线duduqq

只看该作者 5楼 发表于: 2008-08-08
谢谢
不过说真的,不知怎么把这些代码嵌到QT中去,能否给个完整点的,多谢了
离线lazybone
只看该作者 6楼 发表于: 2008-08-08
Jambi
---------------
    protected void keyPressEvent(QKeyEvent event) {
        if (event.key() == Qt.Key.Key_Up.value())
            doSth();
        else if (event.key() == Qt.Key.Key_Down.value())
            doSth();
    }
离线duduqq

只看该作者 7楼 发表于: 2008-08-09
引用第6楼lazybone于2008-08-08 16:45发表的  :
Jambi
---------------
    protected void keyPressEvent(QKeyEvent event) {
        if (event.key() == Qt.Key.Key_Up.value())
            doSth();
.......

我做的不了按下键盘事件,而是用鼠标点击按钮,产生的事件能模拟出按下键盘下样的效果.
离线XChinux

只看该作者 8楼 发表于: 2008-08-09
在qt-apps.org上有见到过一个软键盘。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线duduqq

只看该作者 9楼 发表于: 2008-08-09
太谢谢大家了
离线ynshisss

只看该作者 10楼 发表于: 2008-08-11
我改了你给的例子,不过只能在qtopia core下运行因为要用
QWSServer::sendKeyEvent
Use this function to send key events generated by "virtual keyboards"
离线duduqq

只看该作者 11楼 发表于: 2008-08-11
引用第10楼ynshisss于2008-08-11 15:19发表的  :
我改了你给的例子,不过只能在qtopia core下运行因为要用
QWSServer::sendKeyEvent
Use this function to send key events generated by "virtual keyboards"

不是吧,如何才能在PC机上运行
我今天把例子编译了一下,不能通过,说没有Xtst库
离线ynshisss

只看该作者 12楼 发表于: 2008-08-11
1、你找的例子必须在Linux的X环境下才能使用,可能你的X环境没有安装相关的X开发库,所以编译提示说找不到Xtst库,你自己把X开发库装上就行了。
2、我修改的后的程序只能在Qtopia core环境下运行,因为我把和X相关语句都除掉了,这是因为我想让程序在非X环境下运行,但是离开了X环境,想要发送键盘事件,只能借助Qtopia core中的QWSServer机制,QWSServer在Qt-X11下是不支持的,是Qt-Core独有的,其实QWSServer中也就是用到QWSServer::sendKeyEvent,例如:
QWSServer::sendKeyEvent (QChar('A').unicode(), 9, Qt::NoModifier, true, true);
然后有接收焦点的可编辑控件就会收到
3、其实真正的软键盘要依赖其所在平台的GUI管理器,比如你的例子就要X窗口环境,这样软键盘发送的事件才能传递到正确的GUI组件中去,如果你只是针对某个应用程序才需要一个软键盘,而且软键盘也不需要很复杂,你可以就直接把它嵌入到该应用中,至于判断鼠标点下哪个键并触发相应操作,可以用信号也可以用事件,如果你用的是Qtopia Core的话,就用QWSServer事件机制,如果你一定要做一个真正意义的软键盘,哪就参照例子中如何与X环境交互,同理在
Window下,如果你知道Windows API的话
离线duduqq

只看该作者 13楼 发表于: 2008-08-11
引用第12楼ynshisss于2008-08-11 18:22发表的  :
1、你找的例子必须在Linux的X环境下才能使用,可能你的X环境没有安装相关的X开发库,所以编译提示说找不到Xtst库,你自己把X开发库装上就行了。
2、我修改的后的程序只能在Qtopia core环境下运行,因为我把和X相关语句都除掉了,这是因为我想让程序在非X环境下运行,但是离开了X环境,想要发送键盘事件,只能借助Qtopia core中的QWSServer机制,QWSServer在Qt-X11下是不支持的,是Qt-Core独有的,其实QWSServer中也就是用到QWSServer::sendKeyEvent,例如:
QWSServer::sendKeyEvent (QChar('A').unicode(), 9, Qt::NoModifier, true, true);
然后有接收焦点的可编辑控件就会收到
3、其实真正的软键盘要依赖其所在平台的GUI管理器,比如你的例子就要X窗口环境,这样软键盘发送的事件才能传递到正确的GUI组件中去,如果你只是针对某个应用程序才需要一个软键盘,而且软键盘也不需要很复杂,你可以就直接把它嵌入到该应用中,至于判断鼠标点下哪个键并触发相应操作,可以用信号也可以用事件,如果你用的是Qtopia Core的话,就用QWSServer事件机制,如果你一定要做一个真正意义的软键盘,哪就参照例子中如何与X环境交互,同理在
.......

多谢啊,我是的LINUX下用的,得好好研究才行,现在我还不是很清楚先
离线kingt
只看该作者 14楼 发表于: 2009-01-13
终于让我找到了,哈哈,谢谢了
本人致力于嵌入式开发。
点击这里给我发消息
离线wvins
只看该作者 15楼 发表于: 2009-01-13
收藏
离线duduqq

只看该作者 16楼 发表于: 2009-01-13
在LINUX下的软键盘我已实现很久了,有问题可以和我联系。
我还有个用软键盘控制键盘灯的问题没有解决,希望大家能一起探讨。
[ 此贴被duduqq在2009-01-13 16:50重新编辑 ]
离线chenhualing
只看该作者 17楼 发表于: 2009-05-22
哪位大哥有qt实现的软键盘的源码?发一份过来,非常感谢!
chenhualing812399@163.com
离线duduqq

只看该作者 18楼 发表于: 2009-05-22
引用第17楼chenhualing于2009-05-22 11:28发表的  :
哪位大哥有qt实现的软键盘的源码?发一份过来,非常感谢!
chenhualing812399@163.com


www.qt-apps.org上面有,上去搜索keyboard就能找到,不过那个是在LINUX下的。
离线snowman_st
只看该作者 19楼 发表于: 2009-06-23
为什么我搜索后下载的不是源代码,谁有源代码,谢谢
离线sagadean
只看该作者 20楼 发表于: 2009-07-09
引用第18楼duduqq于2009-05-22 11:42发表的  :
在www.qt-apps.org上面有,上去搜索keyboard就能找到,不过那个是在LINUX下的。


这个好像是X11的,而且编译后没生成一个可执行文件
离线eijs
只看该作者 21楼 发表于: 2009-09-03
duduqq   能把你在embedded下能跑的软键盘传给我么  谢谢   eijs@qq.com
离线duduqq

只看该作者 22楼 发表于: 2009-09-03
引用第21楼eijs于2009-09-03 11:56发表的  :
duduqq   能把你在embedded下能跑的软键盘传给我么  谢谢   eijs@qq.com


PS:例子原代码http://www.qt-apps.org/content/show.php/QVKeyboard?content=77983
离线蓝调
只看该作者 23楼 发表于: 2009-09-03
回 楼主(duduqq) 的帖子
你好,请问那个例子里面的 .pro文件的最后一行  LIBS += -lXtst
是什么东西啊,编译找不到它!
离线duduqq

只看该作者 24楼 发表于: 2009-09-04
Xtst是XWINDOW的库,发按键的信息发到系统主要就是由这个库做的,
如果你用Ubuntun那么可以直接在新立德里面找到并安装上它,如果不是那你就去下这个库编译安装它了。
离线eijs
只看该作者 25楼 发表于: 2009-09-04
duduqq   是for x11的
我要embedded下的  不过现在我做好了
离线hiti_tony
只看该作者 26楼 发表于: 2009-09-04
你点按钮的时候模拟键盘发消息不就行了!

像windowxp的屏幕键盘那样!
开始--〉程序---〉附件----〉辅助工具---〉屏幕键盘  
离线jetlee2012

只看该作者 27楼 发表于: 2010-12-27
回 16楼(duduqq) 的帖子
前辈,能不能发一个软键盘的源码,让晚辈学习学习,我真在做软键盘,困难重重,苦苦摸索中。。。若能相助,在下不胜感激ING。。。
我的邮箱lijieshow@hotmail.com
[ 此帖被jetlee2012在2010-12-27 16:24重新编辑 ]
离线duduqq

只看该作者 28楼 发表于: 2010-12-29
已给到有链接了,自己去下吧
那个是要在嵌入式系统的,如果要做LINUX的或WINDOWS的软键盘,只要把发送按键改成相应系统的API就行了
离线huangquanmin
只看该作者 29楼 发表于: 2012-03-02
此arm能移植到arm板吗,我使用的是Qt4.7.3.........
离线等会

只看该作者 30楼 发表于: 2016-03-30
为什么我这边编译通不过?
/home/linux/qvkeyboard-build-desktop/../qvkeyboard/mainfrm.cpp:519: error: ‘XTestFakeKeyEvent’ was not declared in this scope
快速回复
限100 字节
 
上一个 下一个