一生一世学坛

 找回密码
 立即注册
搜索
查看: 5097|回复: 0
打印 上一主题 下一主题

Qt QTextEdit输入法事件 QInputMethodEvent

[复制链接]

334

主题

385

帖子

6830

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6830
跳转到指定楼层
楼主
发表于 2021-8-26 18:14:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. QInputMethodEvent提供了一些输入法事件有关的参数。

  2.     当使用输入法输入文本的时候输入法事件(QInputMethodEvent)被送到窗体(控件).输入法被广泛使用,以输入非拉丁系的语言(例如中文等)。
  3.     当创建了一个自定义的文本输入框,窗体属性 Qt::WA_InputMethodEnabled必须明确指定( 用QWidget::setAttribute()函数 ),以收到输入法事件。
  4.     例如:ui->textEdit->setAttribute(Qt::WA_InputMethodEnabled,true) ,手动调用系统输入法。
  5.     这些事件,对于需要正确处理复合语言输入的键盘输入控件很有用。文本框中输入语言时一般经过下面3个步骤:
  6.     (1)开始写作(开始调用输入法输入)
  7.     当用户第一次按下键盘上的键,一个输入上下文被创建,这个输入上下文包含打字特性的字符串。
  8.     (2)写作中(输入法正在输入中)
  9.     随着每一个新的键按下,输入法将尝试创建到目前为止,与被称为预编辑字符串的所输入文本相匹配的字符串。当输入上下文是活动的时候,用户只能将光标在属于该输入上下文内的字符串内移动。
  10.     (3)写作完成(输入法输入完成,例如点击enter或空格键)
  11.     在某些时候,用户将激活用户界面组件(也许使用某个特定的键),从中选择一些到目前为止与所键入的文本匹配的字符串。用户可以选择确认或取消输入,在这两种情况下,输入上下文将被关闭。
  12.     QInputMethodEvent塑造这三个阶段,并且正确地传送中间结果的信息。QInputMethodEvent有两个主要参数:preeditString()和commitString()。 preeditString()给出的是当前活跃的预编辑字符串。 commitString()给出的是应该被添加(或更换)到文本编辑器部件的文本。它通常是一个输入操作的结果,并且将要被插入到文本框,插入后即成为预编辑字符串。
  13.     如果commitString()会替换文本框中的部分文本,replacementLength()返回需要替换的字符数目,replacementStart()返回开始替换的位置,从预编辑字符串的起点开始计算。
  14.     有很多属性用来控制预编辑字符串的显示风格(预编辑字符串之外的文本的显示风格仅仅被所在的windget控制),Attribute Type 枚举说明了可以设置的几个不同属性。


  15.     以上为根据英文文档进行的翻译。

  16.     英文文档里有文本控件收到输入法事件后的处理步骤。

  17.    以下为程序示例。


  18. 程序示例:

  19. QTextEdit默认在失去焦点的时候会将正在输入的内容提交。

  20. 例如下面的图片,在失去焦点后,QTextEdit控件中的内容为 [测试,这些内容jiang'bei'ti'jiao] 。





  21. 在本程序中,文本框在失去焦点的时候放弃还未按enter提交的内容。解决搜狗(或QQ)输入法等输入法失去焦点时会将字幕输入到输入框问题。


  22. 代码文件

  23. 1. CustomTextEdit.h

  24. #ifndef CUSTOMTEXTEDIT_H
  25. #define CUSTOMTEXTEDIT_H
  26. #include <QTextEdit>
  27. #include <QWidget>
  28. #include <QEvent>
  29. /******************************
  30. *QInputMethodEvent事件演示小程序。
  31. *程序功能:在失去QTextEdit控件失去焦点的时候放弃正在输入的内容。
  32.   *                  解决搜狗(或QQ)输入法等输入法失去焦点时会将字幕输入到输入框问题。
  33. *也算练了练自定义窗口部件
  34. *在Qt设计师上集成自定义窗口控件的方法之提升法:
  35. *(1)在Qt设计师的窗体中,右键->提升的窗口部件->在新建提升的类一栏输入完信息后,点击添加
  36. *(2)选择一个内置的Qt窗口部件,右键->提升为->在新建提升的类一栏输入完信息后,点击提升
  37. ******************************/
  38. class CustomTextEdit : public QTextEdit
  39. {
  40.     Q_OBJECT
  41. public :
  42.     CustomTextEdit(QWidget *parent = 0);
  43.     ~CustomTextEdit();
  44.     bool eventFilter(QObject *_watcher, QEvent *_event);
  45. };
  46. #endif // CUSTOMTEXTEDIT_H


  47. 2. CustomTextEdit.cpp

  48. #include "CustomTextEdit.h"
  49. #include <QInputMethodEvent>
  50. CustomTextEdit::CustomTextEdit(QWidget *e)
  51.     :QTextEdit(e)
  52. {
  53.     installEventFilter(this);
  54. }
  55. CustomTextEdit::~CustomTextEdit()
  56. {
  57. }
  58. bool CustomTextEdit::eventFilter(QObject *_watcher, QEvent *_event)
  59. {
  60.     /********************************************验证事件处理顺序
  61.     if(QEvent::FocusOut == _event->type())
  62.     {
  63.         qDebug() << "===============FocusOut====="<< hasFocus() <<"===============";
  64.     }
  65.     ************************************************************/
  66.     if(QEvent::InputMethod == _event->type())  //输入法事件
  67.     {
  68.         //qDebug() << "============InputMethod====="<< hasFocus() <<"=============";
  69.         if(!hasFocus()) //经验证,失去焦点时,输入法事件优先于FocusOut事件被处理
  70.         {
  71.             QInputMethodEvent* iEvent = dynamic_cast<QInputMethodEvent*> (_event); //注意用将_event括起来
  72.             iEvent->setCommitString("");    //将失去焦点后提交的字符串设置为空
  73.         }
  74.     }
  75.     return QTextEdit::eventFilter(_watcher,_event);
  76. }


  77. 3.edittestdialog.h

  78. #ifndef EDITTESTDIALOG_H
  79. #define EDITTESTDIALOG_H
  80. #include <QDialog>
  81. namespace Ui {
  82. class EditTestDialog;
  83. }
  84. class EditTestDialog : public QDialog
  85. {
  86.     Q_OBJECT
  87. public:
  88.     explicit EditTestDialog(QWidget *parent = 0);
  89.     ~EditTestDialog();
  90. private slots:
  91.     void on_sendButton_clicked();
  92. private:
  93.     Ui::EditTestDialog *ui;
  94. };
  95. #endif // EDITTESTDIALOG_H


  96. 4.edittestdialog.cpp

  97. #include "edittestdialog.h"
  98. #include "ui_edittestdialog.h"
  99. EditTestDialog::EditTestDialog(QWidget *parent) :
  100.     QDialog(parent),
  101.     ui(new Ui::EditTestDialog)
  102. {
  103.     ui->setupUi(this);
  104.     ui->resultLabel->setStyleSheet("color:rgb(255,0,255); \
  105.           font-family:Microsoft YaHei; \
  106.           border-radius:10px; \
  107.           background-color:rgb(0,240,240); \
  108.           border: 1px solid red;"); //设个样式表,以免内容为空时看不见
  109. }
  110. EditTestDialog::~EditTestDialog()
  111. {
  112.     delete ui;
  113. }
  114. void EditTestDialog::on_sendButton_clicked()
  115. {
  116.     QString message = ui->inputTextEdit->toPlainText(); //将内容转化为纯文本(QTextEdit是可以输入富文本的)
  117.     ui->resultLabel->setText(message);   //点击发送时将信息显示出来
  118. }


  119. 5. main.cpp

  120. #include <QtGui/QApplication>
  121. #include "edittestdialog.h"
  122. int main(int argc, char *argv[])
  123. {
  124.     QApplication a(argc, argv);
  125.     EditTestDialog w;
  126.     w.show();

  127.     return a.exec();
  128. }


复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|分享学习  

GMT+8, 2024-5-17 11:15 , Processed in 0.042765 second(s), 6 queries , File On.

声明:本站严禁任何人以任何形式发表违法言论!

本站内容由网友原创或转载,如果侵犯了您的合法权益,请及时联系处理!© 2017 zamxqun@163.com

皖公网安备 34010402700634号

皖ICP备17017002号-1

快速回复 返回顶部 返回列表