QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)相关的知识,希望对你有一定的参考价值。

因为项目的需要以及主管的要求,准备将工程移植到Qt中,这样就可以比较容易的实现跨平台了。因为之前工程是在windows下开发的,第一个平台又是mobile所以除了底层框架之外其他的都是使用的windows的API以及编程模式,现在要移植到Qt中,第一个要面临的问题就是如何将windows的消息机制很好的转换为Qt中的处理机制。windows中是消息,Qt中是事件和信号、槽,其实原理都是一样的。

1、常用事件

因为所有和界面相关的类都是继承自QWidget类,所以QWidget类有的时间和方法,在每个界面相关的类中都有,最常用的一些事件如下:

 

[cpp] view plain copy
 
 print?
  1. <span style="font-size:18px;">//   bool event(QEvent *);  
  2. //   virtual void mousePressEvent(QMouseEvent *);  
  3. //   virtual void mouseReleaseEvent(QMouseEvent *);  
  4. //   virtual void mouseDoubleClickEvent(QMouseEvent *);  
  5. //   virtual void mouseMoveEvent(QMouseEvent *);  
  6. //   virtual void wheelEvent(QWheelEvent *);  
  7. //   virtual void keyPressEvent(QKeyEvent *);  
  8. //   virtual void keyReleaseEvent(QKeyEvent *);  
  9. //   virtual void focusInEvent(QFocusEvent *);  
  10. //   virtual void focusOutEvent(QFocusEvent *);  
  11. //   virtual void enterEvent(QEvent *);  
  12. //   virtual void leaveEvent(QEvent *);  
  13. //   virtual void paintEvent(QPaintEvent *);  
  14. //   virtual void moveEvent(QMoveEvent *);  
  15. //   virtual void resizeEvent(QResizeEvent *);  
  16. //   virtual void closeEvent(QCloseEvent *);  
  17. //   virtual void contextMenuEvent(QContextMenuEvent *);  
  18. //   virtual void tabletEvent(QTabletEvent *);  
  19. //   virtual void actionEvent(QActionEvent *);  
  20. //   virtual void dragEnterEvent(QDragEnterEvent *);  
  21. //   virtual void dragMoveEvent(QDragMoveEvent *);  
  22. //   virtual void dragLeaveEvent(QDragLeaveEvent *);  
  23. //   virtual void dropEvent(QDropEvent *);  
  24. //   virtual void showEvent(QShowEvent *);  
  25. //   virtual void hideEvent(QHideEvent *);  
  26. //#if defined(Q_WS_MAC)  
  27. //   virtual bool macEvent(EventHandlerCallRef, EventRef);  
  28. //#endif  
  29. //#if defined(Q_WS_WIN)  
  30. //   virtual bool winEvent(MSG *message, long *result);  
  31. //#endif  
  32. //#if defined(Q_WS_X11)  
  33. //   virtual bool x11Event(XEvent *);  
  34. //#endif  
  35. //#if defined(Q_WS_QWS)  
  36. //   virtual bool qwsEvent(QWSEvent *);  
  37. //#endif  
  38.   
  39. //    // Misc. protected functions  
  40. //   virtual void changeEvent(QEvent *);  
  41.   
  42. //   virtual void inputMethodEvent(QInputMethodEvent *);  
  43.   
  44.    virtual void mouseMoveEvent(QMouseEvent *);  
  45.    virtual void mousePressEvent(QMouseEvent *);  
  46.    virtual void keyPressEvent(QKeyEvent *);  
  47.    virtual void paintEvent(QPaintEvent *);  
  48.    virtual void inputMethodEvent(QInputMethodEvent *);</span>  

 

 

如果我们想要使用这些事件,只需要在自己的类中继承并重写这些事件处理函数就行了。

另外有一点在使用

[cpp] view plain copy
 
 print?
  1. <span style="font-size:18px;">   virtual void inputMethodEvent(QInputMethodEvent *);</span>  

这个事件的时候我们需要注意一下,因为在QWidget类中默认是忽略这个事件的,所以如果想要在使用输入法的时候截获这个事件就需要在自己的类构造函数中对自己的窗体类进行属性设置,具体代码如下:

 

 

[cpp] view plain copy
 
 print?
  1. <span style="font-size:18px;">    this->setAttribute(Qt::WA_InputMethodEnabled);  
  2.     this->setAttribute(Qt::WA_KeyCompression);  
  3.     this->setFocusPolicy(Qt::WheelFocus);</span>  


这个事件还是比较有用的,因为在使用输入法特别是中文的时候,要获取输入的内容就必须使用这个事件。

 

普通的拉丁字母获取键值就很简单了,重写

[cpp] view plain copy
 
 print?
  1. <span style="font-size:18px;">   virtual void keyPressEvent(QKeyEvent *);</span>  

相关的事件就行了。

 

 

2、简单2D绘图

这里要使用到QPainter类以及它的一些方法,并重写

[cpp] view plain copy
 
 print?
  1. <span style="font-size:18px;">   virtual void paintEvent(QPaintEvent *);</span>  

事件就行了,简单的使用代码如下:

 

 

[cpp] view plain copy
 
 print?
  1. <span style="font-size:18px;">    QPainter painter(this);  
  2.     QPen pen; //画笔  
  3.     QBrush brush;//画刷  
  4.     painter.drawLine(0,0,100,200);  
  5.   
  6.     pen.setColor(QColor(255,0,0));  
  7.     brush.setColor(QColor(0,255,0,255));  
  8.     brush.setStyle(Qt::SolidPattern);  
  9.   
  10.     painter.setPen(pen); //添加画笔  
  11.     painter.setBrush(brush); //添加画刷  
  12.     painter.drawRect(50,70,160,200); //绘制矩形</span>  


好了,今天是回归C/C++和Qt之后写的第一篇博客,内容比较简单,但是很基础,写的不好,希望大家见谅。

 

今天就到此为止了!!

http://blog.csdn.net/songjinshi/article/details/7186524

以上是关于QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)的主要内容,如果未能解决你的问题,请参考以下文章

C++:类中两个易被忽略的默认函数

QWidget 似乎忽略了 EventFilter 传递的事件

如何将 QWidget 类中的 lineedit 字符串共享到工作线程

accept()函数用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;ignore()函数则告诉Qt,事件处理函数“忽略”了这个事件,需要继续传递(看一下QWidget::mousePress

com.android.inputmethod.latin 中的 ANR 原因:输入调度超时

如何使用“android:inputMethod”属性?