qt软键盘输入
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软键盘输入的更多相关文章
- Android - 隐藏EditText弹出的软键盘输入(SoftInput)
隐藏EditText弹出的软键盘输入(SoftInput) 本文地址: http://blog.csdn.net/caroline_wendy 保持界面的整洁, 能够选择在进入界面时, 隐藏EditT ...
- Android软键盘调用及隐藏,以及获得点击软键盘输入的字母信息
在Android提供的EditText中单击的时候,会自动的弹出软键盘,其实对于软键盘的控制我们可以通过InputMethodManager这个类来实现.我们需要控制软键盘的方式就是两种一个是像Edi ...
- QT软键盘
如何实现鼠标单击弹出软键盘 默认情况下,如果当前编辑框无焦点,则需要鼠标点击两次才弹出软键盘,其中第一次是让该编辑框获得焦点,第二次点击才弹出软键盘: 如果当前编辑框已经获得焦点,则点击一次就会弹出软 ...
- Qt 获取键盘输入
void vc_widget::keyPressEvent(QKeyEvent *ev) { if (ev->key() == Qt::Key_Up) { qDebug() << & ...
- Android开发:在EditText中关闭软键盘 转来的
1.EditText有焦点(focusable为true)阻止输入法弹出 editText=(EditText)findViewById(R.id.txtBody); editText.setOnTo ...
- Android软键盘与输入框的设置
大家开发Android或者用app的时候会发现转到输入框就会自动弹出软键盘,切换别的页面就会自动的隐藏,下面几行代码用的熟练了就行了: 1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) I ...
- Android开发UI之手动显示和隐藏软键盘
1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Contex ...
- Android 手动显示和隐藏软键盘
1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Contex ...
- 软键盘 输入法管理器 InputMethodManager
基本介绍 软键盘的显示原理 软键盘其实是一个Dialog.InputMethodService为我们的输入法创建了一个Dialog,并且对某些参数进行了设置,使之能够在底部或者全屏显示.当我们点击输 ...
随机推荐
- Oracle系列之表空间
涉及到表的处理请参看原表结构与数据 Oracle建表插数据等等 创建表空间等等 select tablespace_name from dba_tablespaces;--dba权限用户查询数据库中 ...
- android & Linux uevent机制
Linux uevent机制 Uevent是内核通知android有状态变化的一种方法,比如USB线插入.拔出,电池电量变化等等.其本质是内核发送(可以通过socket)一个字符串,应用层(andro ...
- BZOJ1334: [Baltic2008]Elect
1334: [Baltic2008]Elect Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 386 Solved: 201[Submit][Sta ...
- POJ 3159 Candies 解题报告(差分约束 Dijkstra+优先队列 SPFA+栈)
原题地址:http://poj.org/problem?id=3159 题意大概是班长发糖果,班里面有不良风气,A希望B的糖果不比自己多C个.班长要满足小朋友的需求,而且要让自己的糖果比snoopy的 ...
- ruby2.2.2 源代码阅读笔记
这是win32下的结构 从ruby_setup开始阅读 Ruby对象内存结构 RVALUE是一个union,内含ruby所有结构体(RBasic RObject RClass RFloat RStri ...
- 【转】Visual Studio快捷键汇总
原文网址:http://www.cnblogs.com/lanxuezaipiao/p/3451943.html Visual Studio最好用的快捷键(你最喜欢哪个) 每次在网上搜关于VS有哪些常 ...
- 函数的重载与 泛型(generic)有什么不同?
函数重载指 重载函数,形参(类型)不同,实现的功能一样. 泛型算法指2个方面:这些算法可作用于各种不同的容器类型,而这些容器类型又可以容纳多种不同类型的元素.
- JAX-RS -- Java API for RESTful Web Services
Java EE 6 引入了对 JSR-311 的支持.JSR-311(JAX-RS:Java API for RESTful Web Services)旨在定义一个统一的规范,使得 Java 程序员可 ...
- C#.NET 打印连续纸高度动态变化(基于长江支流的金质打印通)
问题是这样的,打印机使用的是卷筒的连续纸,要打印的内容因为数据行数不同,高度会有变化.这时如果能在打印时动态改变纸张大小(其实只改变高度即可)当然是最好的选择. 我使用了网上久负盛名的[长江支流]的“ ...
- AndroidStudio旧模板使用方法
***AndroidStudio旧模板使用方法*** 解压后用BlankActivity文件夹替换AndroidStudio安装目录下plugins\android\lib\templates\act ...