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

1、常用事件

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

  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. //    // Misc. protected functions
  39. //   virtual void changeEvent(QEvent *);
  40. //   virtual void inputMethodEvent(QInputMethodEvent *);
  41. virtual void mouseMoveEvent(QMouseEvent *);
  42. virtual void mousePressEvent(QMouseEvent *);
  43. virtual void keyPressEvent(QKeyEvent *);
  44. virtual void paintEvent(QPaintEvent *);
  45. virtual void inputMethodEvent(QInputMethodEvent *);</span>

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

另外有一点在使用

  1. <span style="font-size:18px;">   virtual void inputMethodEvent(QInputMethodEvent *);</span>

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

  1. <span style="font-size:18px;">    this->setAttribute(Qt::WA_InputMethodEnabled);
  2. this->setAttribute(Qt::WA_KeyCompression);
  3. this->setFocusPolicy(Qt::WheelFocus);</span>

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

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

  1. <span style="font-size:18px;">   virtual void keyPressEvent(QKeyEvent *);</span>

相关的事件就行了。

2、简单2D绘图

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

  1. <span style="font-size:18px;">   virtual void paintEvent(QPaintEvent *);</span>

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

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

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

今天就到此为止了!!

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

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

  1. Swift - AppDelegate.swift类中默认方法的介绍

    项目创建后,AppDelegate类中默认带有如下几个方法,具体功能如下: 1,应用程序第一次运行时执行 这个方法只有在App第一次运行的时候被执行过一次,每次App从后台激活时都不会再执行该方法. ...

  2. selenium+python+unittest:一个类中只执行一次setUpClass和tearDownClass里面的内容(可解决重复打开浏览器和关闭浏览器,或重复登录等问题)

    unittest框架是python自带的,所以直接import unittest即可,定义测试类时,父类是unittest.TestCase. 可实现执行测试前置条件.测试后置条件,对比预期结果和实际 ...

  3. C++类中隐藏的六个默认函数

    Test类中隐藏的六个默认的函数 class Test { public: //默认的构造函数 Test(): //析构函数 ~Test(): //拷贝构造函数 Test(const Test &am ...

  4. Scala的类中定义内部类实战

    scala独特之处在于可以在类中定义内部类,起到对外屏蔽作用. 类中默认都是public权限.后面将讲解如何引入接口,scala中的接口与java点区别.特质/接口(Trait)

  5. cocos2dx lua 绑定之一:自动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...

  6. 关于在C#中对类中的隐藏基类方法和重写方法的理解

    最近在学习C#,在C#中的类看到重写和隐藏基类的方法这些概念.才开始感觉自己不是很理解这些概念.也区分不开这些概念.通过自己的查找资料和练习后.慢慢的理解了类中的隐藏和重写这个概念.在C#中只有在基类 ...

  7. 【转载】 C#检测输入的内容中是否含有中文

    在C#开发中,可以结合正则表达式,来检测输入的内容中是否包含中文,Regex类是C#中有关正则表达式处理的相关类,功能强大,我们只需要设置好规则,即可很快检测出输入的字符串内容中是否含有中文信息. R ...

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

    C++的自定义类中有六个默认的函数,即如果用户没有显式定义这些函数时,C++编译器会类中生成这些函数的默认形式.除了大家所熟知的构造函数.拷贝构造函数.赋值函数和析构函数外,C++为自定义类 还提供了 ...

  9. QT中QWidget类简介

    一.详细描述 QWidget类是所有用户界面对象的基类.通俗的来讲,Qt基本上所有的UI类都是由QWidget继承出来的,而QWidget继承于QObject,  大家可以查阅Qt source 即可 ...

随机推荐

  1. codeforces 464B Restore Cube

    题目链接 给8个点, 判断这8个点能否组成一个正方体, 如果能, 输出这8个点. 同一个点的x, y, z可以交换. 每一个点有6种排列方式, 一个8个点, 暴力枚举出所有排列方式然后判断能否组成正方 ...

  2. c++继承构造子类调用父类构造函数的问题及关于容器指针的问题及当容器里储存指针时,记得要手动释放

    看下面的一个问题: class Person { private: string name; public: Person(const string& s=""){ nam ...

  3. BZOJ 1600: [Usaco2008 Oct]建造栅栏

    1600: [Usaco2008 Oct]建造栅栏 Time Limit: 5 Sec  Memory Limit: 64 MB Description 勤奋的Farmer John想要建造一个四面的 ...

  4. 权限管理之基于ACL的实现:自定义JSTL函数实现即时认证

    实现即时认证(即只有拥有相应的权限,才能做相应的操作) 经常用在,在JSP页面上,调用JSTL自定义函数做判断,显示相应的菜单或者功能按钮,比如只有管理员登陆时才显示“删除”按钮,从而完成权限的即时认 ...

  5. 技术贴:解码时AVC1和H264的差别

    我一直疑问为什么有些视频解码时显示格式是:H264,大部分又是:AVC1 我在搜索编程资料时在微软的msdn上发现的: 原文:http://msdn.microsoft.com/en-us/libra ...

  6. Yii Framework2.0开发教程(2)使用表单Form

    第一步.接着教程(1).我们在controllers/ZhyoulunController.php中加入两处, 1) use app\models\EntryForm; 和 2) public fun ...

  7. ARM

    ARM全新架构:cortex架构 cortex-A:高端:cortex-R:实时嵌入式系统:cortex-m:廉价: 哈佛结构:数据总线和地址总线分开: 冯若依曼:地址总线,数据总线不分开: cort ...

  8. uVa 714 (二分法)

    Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Description   Before th ...

  9. [置顶] PHP调用move_uploaded_file()提示 failed to open stream: Permission denied(Linxux环境,以Ubuntu12.04为例)

    在使用PHP上传文件之后,我们有时候还需要移动到特定的文件夹,这时候就要调用move_uploaded_file()函数,可是会出现如下错误: Warning: move_uploaded_file( ...

  10. MyEclipse 引用其他项目及其jar包

    倘若在工作区有两个项目A和B,B项目引用A项目及其jar包(防止调用时A项目的方法出现NoClassFound),步骤如下: 在A项目上点右键看属性,点击Build Path--->Concon ...