QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)
因为项目的需要以及主管的要求,准备将工程移植到Qt中,这样就可以比较容易的实现跨平台了。因为之前工程是在windows下开发的,第一个平台又是mobile所以除了底层框架之外其他的都是使用的windows的API以及编程模式,现在要移植到Qt中,第一个要面临的问题就是如何将windows的消息机制很好的转换为Qt中的处理机制。windows中是消息,Qt中是事件和信号、槽,其实原理都是一样的。
1、常用事件
因为所有和界面相关的类都是继承自QWidget类,所以QWidget类有的时间和方法,在每个界面相关的类中都有,最常用的一些事件如下:
- <span style="font-size:18px;">// bool event(QEvent *);
- // virtual void mousePressEvent(QMouseEvent *);
- // virtual void mouseReleaseEvent(QMouseEvent *);
- // virtual void mouseDoubleClickEvent(QMouseEvent *);
- // virtual void mouseMoveEvent(QMouseEvent *);
- // virtual void wheelEvent(QWheelEvent *);
- // virtual void keyPressEvent(QKeyEvent *);
- // virtual void keyReleaseEvent(QKeyEvent *);
- // virtual void focusInEvent(QFocusEvent *);
- // virtual void focusOutEvent(QFocusEvent *);
- // virtual void enterEvent(QEvent *);
- // virtual void leaveEvent(QEvent *);
- // virtual void paintEvent(QPaintEvent *);
- // virtual void moveEvent(QMoveEvent *);
- // virtual void resizeEvent(QResizeEvent *);
- // virtual void closeEvent(QCloseEvent *);
- // virtual void contextMenuEvent(QContextMenuEvent *);
- // virtual void tabletEvent(QTabletEvent *);
- // virtual void actionEvent(QActionEvent *);
- // virtual void dragEnterEvent(QDragEnterEvent *);
- // virtual void dragMoveEvent(QDragMoveEvent *);
- // virtual void dragLeaveEvent(QDragLeaveEvent *);
- // virtual void dropEvent(QDropEvent *);
- // virtual void showEvent(QShowEvent *);
- // virtual void hideEvent(QHideEvent *);
- //#if defined(Q_WS_MAC)
- // virtual bool macEvent(EventHandlerCallRef, EventRef);
- //#endif
- //#if defined(Q_WS_WIN)
- // virtual bool winEvent(MSG *message, long *result);
- //#endif
- //#if defined(Q_WS_X11)
- // virtual bool x11Event(XEvent *);
- //#endif
- //#if defined(Q_WS_QWS)
- // virtual bool qwsEvent(QWSEvent *);
- //#endif
- // // Misc. protected functions
- // virtual void changeEvent(QEvent *);
- // virtual void inputMethodEvent(QInputMethodEvent *);
- virtual void mouseMoveEvent(QMouseEvent *);
- virtual void mousePressEvent(QMouseEvent *);
- virtual void keyPressEvent(QKeyEvent *);
- virtual void paintEvent(QPaintEvent *);
- virtual void inputMethodEvent(QInputMethodEvent *);</span>
如果我们想要使用这些事件,只需要在自己的类中继承并重写这些事件处理函数就行了。
另外有一点在使用
- <span style="font-size:18px;"> virtual void inputMethodEvent(QInputMethodEvent *);</span>
这个事件的时候我们需要注意一下,因为在QWidget类中默认是忽略这个事件的,所以如果想要在使用输入法的时候截获这个事件就需要在自己的类构造函数中对自己的窗体类进行属性设置,具体代码如下:
- <span style="font-size:18px;"> this->setAttribute(Qt::WA_InputMethodEnabled);
- this->setAttribute(Qt::WA_KeyCompression);
- this->setFocusPolicy(Qt::WheelFocus);</span>
这个事件还是比较有用的,因为在使用输入法特别是中文的时候,要获取输入的内容就必须使用这个事件。
普通的拉丁字母获取键值就很简单了,重写
- <span style="font-size:18px;"> virtual void keyPressEvent(QKeyEvent *);</span>
相关的事件就行了。
2、简单2D绘图
这里要使用到QPainter类以及它的一些方法,并重写
- <span style="font-size:18px;"> virtual void paintEvent(QPaintEvent *);</span>
事件就行了,简单的使用代码如下:
- <span style="font-size:18px;"> QPainter painter(this);
- QPen pen; //画笔
- QBrush brush;//画刷
- painter.drawLine(0,0,100,200);
- pen.setColor(QColor(255,0,0));
- brush.setColor(QColor(0,255,0,255));
- brush.setStyle(Qt::SolidPattern);
- painter.setPen(pen); //添加画笔
- painter.setBrush(brush); //添加画刷
- painter.drawRect(50,70,160,200); //绘制矩形</span>
好了,今天是回归C/C++和Qt之后写的第一篇博客,内容比较简单,但是很基础,写的不好,希望大家见谅。
今天就到此为止了!!
http://blog.csdn.net/songjinshi/article/details/7186524
QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)的更多相关文章
- Swift - AppDelegate.swift类中默认方法的介绍
项目创建后,AppDelegate类中默认带有如下几个方法,具体功能如下: 1,应用程序第一次运行时执行 这个方法只有在App第一次运行的时候被执行过一次,每次App从后台激活时都不会再执行该方法. ...
- selenium+python+unittest:一个类中只执行一次setUpClass和tearDownClass里面的内容(可解决重复打开浏览器和关闭浏览器,或重复登录等问题)
unittest框架是python自带的,所以直接import unittest即可,定义测试类时,父类是unittest.TestCase. 可实现执行测试前置条件.测试后置条件,对比预期结果和实际 ...
- C++类中隐藏的六个默认函数
Test类中隐藏的六个默认的函数 class Test { public: //默认的构造函数 Test(): //析构函数 ~Test(): //拷贝构造函数 Test(const Test &am ...
- Scala的类中定义内部类实战
scala独特之处在于可以在类中定义内部类,起到对外屏蔽作用. 类中默认都是public权限.后面将讲解如何引入接口,scala中的接口与java点区别.特质/接口(Trait)
- cocos2dx lua 绑定之一:自动绑定自定义类中的函数
cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...
- 关于在C#中对类中的隐藏基类方法和重写方法的理解
最近在学习C#,在C#中的类看到重写和隐藏基类的方法这些概念.才开始感觉自己不是很理解这些概念.也区分不开这些概念.通过自己的查找资料和练习后.慢慢的理解了类中的隐藏和重写这个概念.在C#中只有在基类 ...
- 【转载】 C#检测输入的内容中是否含有中文
在C#开发中,可以结合正则表达式,来检测输入的内容中是否包含中文,Regex类是C#中有关正则表达式处理的相关类,功能强大,我们只需要设置好规则,即可很快检测出输入的字符串内容中是否含有中文信息. R ...
- C++:类中两个易被忽略的默认函数
C++的自定义类中有六个默认的函数,即如果用户没有显式定义这些函数时,C++编译器会类中生成这些函数的默认形式.除了大家所熟知的构造函数.拷贝构造函数.赋值函数和析构函数外,C++为自定义类 还提供了 ...
- QT中QWidget类简介
一.详细描述 QWidget类是所有用户界面对象的基类.通俗的来讲,Qt基本上所有的UI类都是由QWidget继承出来的,而QWidget继承于QObject, 大家可以查阅Qt source 即可 ...
随机推荐
- Microsoft Jet 数据库引擎找不到对象'Sheet1$_'。请确定对象是否存在,并正确地写出它的名称和路径
We have a CRM add-on for Importing Price Lists into CRM. For this tool, we expect the details to be ...
- c++ 对象作为参数传递
对象作为参数传递时是传值.把实参的对象赋值给形参.因此效率有点低. c++传参方式可以分为2种: 1.传值 (指针作为参数,本质上也只是把地址作为值传递了而已). 2.传引用. 所以,一切传递方式不是 ...
- poj 3295 Tautology(栈)
题目链接:http://poj.org/problem?id=3295 思路分析:判断逻辑表达式是否为永真式问题.根据该表达式的特点,逻辑词在逻辑变量前,类似于后缀表达式求值问题. 算法中使用两个栈, ...
- android-改进<<仿QQ>>框架源代码
该文章主要改动于CSDN某大神的一篇文章,本人认为这篇文章的面向对象非常透彻,以下分享例如以下可学习的几点: Android应用经典主界面框架之中的一个:仿QQ (使用Fragment, 附源代码) ...
- MYSQL - php 使用 localhost 无法连接数据库
php 使用 localhost 无法连接数据库,而使用127.0.0.1却能连接成功. 可能原因: 系统hosts文件未提供127.0.0.1到localhost的解析.解决方法(以win7系统为例 ...
- c++,内联成员函数
内联成员函数有两程方式实现内联成员函数1)在声名成员函数的同时定义成员函数体2)声明成员函数时,在最前面加上inline关键字在定义成员函数时也在最前面加上inline关键字 建议inline函数在头 ...
- ARM异常---一个DataAbort的触发过程:
一个DataAbort异常的触发过程://////////////////////////////xxxx.inc_STACK_BASEADDRESS EQU 0x33ff8000_MMUTT_STA ...
- C#路径,文件,目录,I/O常见操作
C#路径,文件,目录,I/O常见操作 文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供 ...
- 纯JAVA驱动:sqlserver版本不同,驱动与连接也有所区别
纯JAVA驱动:// 2005 版本:驱动:Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");连接:”jd ...
- CSS长度单位及区别 em ex px pt in
1. css相对长度单位 Ø em 元素的字体高度 Ø ex 字体x的高度 Ø px ...