Qt输入法事件 QInputMethodEvent
来源:互联网 发布:萝莉酱llj222备用域名 编辑:程序博客网 时间:2024/06/13 19:38
解决搜狗(或QQ)输入法等输入法失去焦点时会将字幕输入到输入框问题。小记一下。
QInputMethodEvent提供了一些输入法事件有关的参数。 当使用输入法输入文本的时候输入法事件(QInputMethodEvent)被送到窗体(控件).输入法被广泛使用,以输入非拉丁系的语言(例如中文等)。 当创建了一个自定义的文本输入框,窗体属性 Qt::WA_InputMethodEnabled必须明确指定( 用QWidget::setAttribute()函数 ),以收到输入法事件。 例如:ui->textEdit->setAttribute(Qt::WA_InputMethodEnabled,true) ,手动调用系统输入法。 这些事件,对于需要正确处理复合语言输入的键盘输入控件很有用。文本框中输入语言时一般经过下面3个步骤: (1)开始写作(开始调用输入法输入) 当用户第一次按下键盘上的键,一个输入上下文被创建,这个输入上下文包含打字特性的字符串。 (2)写作中(输入法正在输入中) 随着每一个新的键按下,输入法将尝试创建到目前为止,与被称为预编辑字符串的所输入文本相匹配的字符串。当输入上下文是活动的时候,用户只能将光标在属于该输入上下文内的字符串内移动。 (3)写作完成(输入法输入完成,例如点击enter或空格键) 在某些时候,用户将激活用户界面组件(也许使用某个特定的键),从中选择一些到目前为止与所键入的文本匹配的字符串。用户可以选择确认或取消输入,在这两种情况下,输入上下文将被关闭。 QInputMethodEvent塑造这三个阶段,并且正确地传送中间结果的信息。QInputMethodEvent有两个主要参数:preeditString()和commitString()。 preeditString()给出的是当前活跃的预编辑字符串。 commitString()给出的是应该被添加(或更换)到文本编辑器部件的文本。它通常是一个输入操作的结果,并且将要被插入到文本框,插入后即成为预编辑字符串。 如果commitString()会替换文本框中的部分文本,replacementLength()返回需要替换的字符数目,replacementStart()返回开始替换的位置,从预编辑字符串的起点开始计算。 有很多属性用来控制预编辑字符串的显示风格(预编辑字符串之外的文本的显示风格仅仅被所在的windget控制),Attribute Type 枚举说明了可以设置的几个不同属性。
以上为根据英文文档进行的翻译。
英文文档里有文本控件收到输入法事件后的处理步骤。
以下为程序示例。
程序示例:
QTextEdit默认在失去焦点的时候会将正在输入的内容提交。
例如下面的图片,在失去焦点后,QTextEdit控件中的内容为 [测试,这些内容jiang'bei'ti'jiao] 。
在本程序中,文本框在失去焦点的时候放弃还未按enter提交的内容。解决搜狗(或QQ)输入法等输入法失去焦点时会将字幕输入到输入框问题。
代码文件
1. CustomTextEdit.h
#ifndef CUSTOMTEXTEDIT_H#define CUSTOMTEXTEDIT_H#include <QTextEdit>#include <QWidget>#include <QEvent>/****************************** *QInputMethodEvent事件演示小程序。 *程序功能:在失去QTextEdit控件失去焦点的时候放弃正在输入的内容。 * 解决搜狗(或QQ)输入法等输入法失去焦点时会将字幕输入到输入框问题。 *也算练了练自定义窗口部件 *在Qt设计师上集成自定义窗口控件的方法之提升法: *(1)在Qt设计师的窗体中,右键->提升的窗口部件->在新建提升的类一栏输入完信息后,点击添加 *(2)选择一个内置的Qt窗口部件,右键->提升为->在新建提升的类一栏输入完信息后,点击提升 ******************************/class CustomTextEdit : public QTextEdit{ Q_OBJECTpublic : CustomTextEdit(QWidget *parent = 0); ~CustomTextEdit(); bool eventFilter(QObject *_watcher, QEvent *_event);};#endif // CUSTOMTEXTEDIT_H2. CustomTextEdit.cpp
#include "CustomTextEdit.h"#include <QInputMethodEvent>CustomTextEdit::CustomTextEdit(QWidget *e) :QTextEdit(e){ installEventFilter(this);}CustomTextEdit::~CustomTextEdit(){}bool CustomTextEdit::eventFilter(QObject *_watcher, QEvent *_event){ /********************************************验证事件处理顺序 if(QEvent::FocusOut == _event->type()) { qDebug() << "===============FocusOut====="<< hasFocus() <<"==============="; } ************************************************************/ if(QEvent::InputMethod == _event->type()) //输入法事件 { //qDebug() << "============InputMethod====="<< hasFocus() <<"============="; if(!hasFocus()) //经验证,失去焦点时,输入法事件优先于FocusOut事件被处理 { QInputMethodEvent* iEvent = dynamic_cast<QInputMethodEvent*> (_event); //注意用将_event括起来 iEvent->setCommitString(""); //将失去焦点后提交的字符串设置为空 } } return QTextEdit::eventFilter(_watcher,_event);}3.edittestdialog.h
#ifndef EDITTESTDIALOG_H#define EDITTESTDIALOG_H#include <QDialog>namespace Ui {class EditTestDialog;}class EditTestDialog : public QDialog{ Q_OBJECT public: explicit EditTestDialog(QWidget *parent = 0); ~EditTestDialog();private slots: void on_sendButton_clicked();private: Ui::EditTestDialog *ui;};#endif // EDITTESTDIALOG_H4.edittestdialog.cpp
#include "edittestdialog.h"#include "ui_edittestdialog.h"EditTestDialog::EditTestDialog(QWidget *parent) : QDialog(parent), ui(new Ui::EditTestDialog){ ui->setupUi(this); ui->resultLabel->setStyleSheet("color:rgb(255,0,255); \ font-family:Microsoft YaHei; \ border-radius:10px; \ background-color:rgb(0,240,240); \ border: 1px solid red;"); //设个样式表,以免内容为空时看不见}EditTestDialog::~EditTestDialog(){ delete ui;}void EditTestDialog::on_sendButton_clicked(){ QString message = ui->inputTextEdit->toPlainText(); //将内容转化为纯文本(QTextEdit是可以输入富文本的) ui->resultLabel->setText(message); //点击发送时将信息显示出来}5. main.cpp
#include <QtGui/QApplication>#include "edittestdialog.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); EditTestDialog w; w.show(); return a.exec();}6. edittestdialog.ui
拖拽3个控件进去:
QTextEDit inputTextEdit ,提升为CustomTextEdit
QPushButton sendButton
QLabel resultLabel
7.InputMethodTest.pro 项目文件
Qt Creator自动添加,略
最终结果如下,点击发送或点击其他窗口使得文本框焦点,文本框中正在输入的内容被舍弃。
by lankin(也算自己做个笔记)
项目源码在 http://download.csdn.net/detail/lingyun0/5995175
- Qt输入法事件 QInputMethodEvent
- QT中文输入法状态下获取键盘输入事件
- QT输入法浅析
- Qt输入法设计(嵌入式)
- Qt软键盘输入法
- Qt开发中文输入法
- QT 禁止输入法弹出
- ubuntu qt 中文输入法
- qt输入法SYSZUXpinyin移植
- qt 中文输入法
- qt 中文输入法
- qt 中文输入法
- Qt输入法设计(嵌入式)
- QT-屏蔽输入法
- qt移植输入法
- qt移植输入法
- qt移植输入法二
- input事件监听输入法事件
- stack/queue的使用方法
- onSaveInstanceState和onRestoreInstanceState触发的时机
- 白书上的Treap模板
- hdu 4004 The Frog's Games
- 用interrupt()中断Java线程
- Qt输入法事件 QInputMethodEvent
- php底部运行机制
- chrome crx 打包 存在中文 路径 结果。。。
- 黑马程序员Java笔记——面向对象的亲密接触
- Tomcat:IOException while loading persisted sessions: java.io.EOFException解决
- web.xml 的详解
- hdu - 4704 - Sum(费马小定理)
- 数学知识二
- nyoj 8