Qt输入法事件 QInputMethodEvent

解决搜狗(或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] 。

输出结果图片1

在本程序中,文本框在失去焦点的时候放弃还未按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_OBJECT
public :
    CustomTextEdit(QWidget *parent = 0);
    ~CustomTextEdit();
    bool eventFilter(QObject *_watcher, QEvent *_event);
};
#endif // CUSTOMTEXTEDIT_H


2. 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_H


4.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自动添加,略

    最终结果如下,点击发送或点击其他窗口使得文本框焦点,文本框中正在输入的内容被舍弃。

输出结果图片2

by lankin(也算自己做个笔记)

项目源码在 http://download.csdn.net/detail/lingyun0/5995175


  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Qt 4.8是一个跨平台的应用程序开发框架,具有丰富的功能和强大的跨平台性能。Qt提供了各种API和工具,使开发者能够轻松地创建具有丰富用户界面和功能的应用程序。 在Qt 4.8中,开发者可以利用Qt输入法框架来开发中文输入法Qt输入法框架提供了一套API,用于处理文本输入和处理输入法相关的功能。开发者可以利用这些API来创建自定义的中文输入法,并集成到他们的应用程序中。 中文输入法开发的主要步骤如下: 1. 设计界面:首先,开发者需要设计输入法的界面。这包括键盘布局、预测输入候选词的显示等。 2. 实现输入法逻辑:开发者需要编写代码来处理用户输入。这包括处理键盘按钮的点击事件和根据用户输入更新预测输入候选词的逻辑等。 3. 集成到应用程序:开发者需要将输入法集成到他们的应用程序中。他们可以使用Qt提供的QWidget或QML来创建一个输入法界面,并在应用程序中显示它。 4. 测试和调试:最后,开发者需要测试输入法的功能,并进行调试以解决任何问题。他们可以使用Qt提供的调试工具来帮助他们进行测试和调试。 总之,Qt 4.8提供了一套强大的输入法框架,使开发者能够轻松地开发中文输入法。开发者可以利用Qt的API和工具来设计自定义的输入法界面,并实现输入法逻辑。然后,他们可以将输入法集成到他们的应用程序中,并进行测试和调试。 ### 回答2: 在Qt4.8中进行中文输入法开发的过程中,首先需要了解Qt输入法架构和概念。 Qt输入法架构主要包含了三个关键类:QInputMethod,QInputMethodEvent和QInputMethodQueryEvent。其中,QInputMethod负责管理输入法的状态,提供一些接口用于查询输入法的属性,以及通知Qt应用程序关于输入法的改变。QInputMethodEvent则是用于传递输入法事件的类,包括了输入法的逻辑按键事件和文本输入事件。而QInputMethodQueryEvent则是用于查询输入法相关信息的事件。 在进行中文输入法开发时,首先需要创建一个继承自QInputMethod的子类,用于管理中文输入法的状态。可以通过重写QInputMethod的接口函数,如setInputMethodArea和setInputDirection,实现对输入法状态的控制和参数的设置。通过调用QInputMethod::update(Qt::ImEnabled)函数,可以通知Qt应用程序关于输入法状态的改变。 接下来,需要重写QInputMethod的keyPressEvent函数,以处理输入法逻辑按键事件。在中文输入法中,常见的逻辑按键包括拼音输入法中的拼音字符和候选字选择键,以及笔画输入法中的笔画选择键。可以根据具体的中文输入法需求,实现按键的处理逻辑,并使用QInputMethodEvent::setCommitString函数将最终的文本结果发送给Qt应用程序。 除了处理逻辑按键事件,还需要重写QInputMethod的invokeAction函数,以处理输入法的特殊动作,如切换输入法模式、切换符号等。可以根据输入法的需求,在该函数中实现相应的特殊动作逻辑。 最后,在Qt应用程序中使用QCoreApplication::inputMethod()函数获取当前的输入法对象,并通过connect函数连接输入法对象的相关信号和槽函数,实现与输入法的交互操作。 总之,在Qt4.8中进行中文输入法开发,需要重写QInputMethod的接口函数,处理逻辑按键事件和特殊动作,并与Qt应用程序进行交互。通过合理地运用Qt输入法架构和相关类,可以方便地实现一个完整的中文输入法
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值