1、Qt使用QKeyEvent类来描述与键盘有关的信息,比如按下或释放键的代码,使用枚举类型QEvent::Type描述与键盘有关的事件,比如QEvent::KeyPress表示键盘按下事件,QEvent::KeyRelease表示键盘释放事件等。
2、是否接收键盘事件,最好明确的调用QEvent::ignore()和QEvent::accept()函数。
3、按键与字符:对于键盘,通常按下一个键会产生一个字符,比如按下A键,会产生字符"a",但有些键不会产生字符,比如delete、insert等键,而且按下A键不一定必须产生字符"a"(比如在中文、德文等其他非英文国家键盘布局的情形下,按键A不一定会产生字符"a")。
4、捕获键盘输入的原理与捕获鼠标输入是相同的,详见鼠标事件。
5、按键与自动重复:自动重复是指按下键盘上的键(修饰键除外)不放时,会不断重复的发送键按下事件,Qt默认是启用自动重复的,若要实现类似按键A+D之类的快捷键,就需要关闭自动重复。可使用如下方法来关闭自动重复
if( QKeyEvent::isAutoRepeat() ) return; // 若自动重复则什么也不做。
6、压缩按键事件(默认为关闭):
①、按下一个键不放时,会不断的发送键按下事件,若程序的处理跟不上键的输入,则Qt可能会尝试压缩该事件,以便在每个事件中处理多个字符。
②、Qt只对可打印字符启用键事件压缩,对于像Enter、Backspace等键不会启用键事件压缩。
③、Mac和X11以外的平台不支持此功能。
④、可使用以下函数来设置键压缩属性
void QWidget::setAttribute ( Qt::WidgetAttribute attribute, bool on=true);
若on为true,则设置部件的属性attribute,若为false,则清除该属性。
示例:setAttribute ( Qt::WA_KeyCompression , rue) //启用键事件压缩。
其中Qt::WidgetAttribute是一个枚举,该枚举定义了部件的一些常用属性,其中对键事件压缩的枚举值为Qt::WA_KeyCompression
bool QWidget::testAttribute(Qt::WidgetAttribute attribute) const
若设置了属性attribute则返回true,否则返回false。
7、Qt使用枚举类型Qt::Key来描述键盘的键代码,下表为该枚举定义的部分成员(详见帮助文档)
8、下面为QKeyEvent类中的成员函数
①、QKeyEvent ( Type type, int key, Qt::KeyboardModifiers modifiers,
const QString &text = QString(), bool autorep = false, ushort count = 1)
type:表示键盘事件的类型,必须是QEvent::KeyPress、QEvent::KeyRelease、QEvent::ShortcutOverride之一
key:用于描述键代码的Qt::Key枚举值。
modifiers:表示键盘的修饰键。
text:表示由按键生成的Unicode字符。
autorep:是否启用自动重复
count:产生该事件时的按键数量。
说明:这是QKeyEvent类的构造函数之一(共有2个),本文仅列举这一个,构造函数可以用于创建QKeyEvent类型的自定义事件,构造函数的参数虽然较多,但是,这些参数只是为创建的事件提供了一些必要的信息而已。
示例:
QKeyEvent e(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier ,
"b", false, 1 );
表示创建一个类型为QEvetn::KeyPress的键盘按下事件,该事件由按键A产生,没有键盘修饰键被按下,但是产生的字符是"b"而不是"a",该事件的重复计数被关闭,且按键数只有1个。创建该自定义事件后,可以使用sendEvent进行发送,并使用部件类的event()函数接收并处理该事件
②、bool isAutoRepeat() const
若事件来自自动重复键,则返回true,否则表示来自初始键按下,返回false,注意,若事件是一个多键压缩事件,则此函数可能会不确定地返回true或false。
③、int key() const
返回按下或释放时来自Qt::Key中定义的键代码(不区分大小写)
④、QString text() const
返回按键所对应的Unicode字符。注:按下Shift,Control,Alt和Meta等修饰键时,返回值在不同平台间有所不同,并可能返回空字符串。
⑤、Qt :: KeyboardModifiers modifiers() const /
返回按下的修饰键,注意:此函数并不总是可靠。
⑥、bool matches (QKeySequence::StandardKey key ) const
若按键与在枚举中QKeySequence::StandardKey定义的标准的key匹配,则返回true,否则返回false。
枚举QKeySequence::StandardKey定义了一些常用的快捷键,比如StandardKey::Copy表示的“复制”的标准快捷键为Ctrl+C,若按下Ctrl+C则这时与StandardKey::Copy是匹配的,返回true。其他的还有“剪功”的快捷键为Ctrl+X,其枚举值为StandardKey::Cut等。
9、QWidget类中与键盘事件有关的函数
①、void grabKeyboard() //捕获键盘输入。
②、void releaseKeyboard() //释放捕获的键盘输入。
③、static QWidget* keyboardGrabber();返回正在捕获键盘输入的部件,若没有则返回0。
本小节学习了以下类及其成员函数
1、QEvent类
①、QEvent(Type type) //构造函数,用于创建自定义事件
②、virtual ~QEvent() //析构函数
③、void accept() //接受事件
④、void ignore() //忽略事件
⑤、void setAccepted(bool a) //设置是否接受事件
⑥、Type type() const //返回事件的类型
⑦、static int registerEventType(int hint=-1):
注册并返回自定义事件类型,使用该函数的返回值可保证自定义的事件不会有重复的Type枚举值。
⑧、enum Type{None, ActionAdded, … Keypress,…} //定义事件的类型,详见帮助文档
2、QObject类
①、virtual bool event() //接收并处理事件,先于默认的事件处理函数
②、void installEventFilter(QObject *finterObj); //安装(或注册)事件过滤器
③、vitrual bool eventFilter(QObject* w , QEvent *e ) //用于接收并处理事件过滤器对象接收的事件。
④、void removeEventFilter(QObject* obj); //移除事件过滤器。
3、QCoreApplication类
①、virtual bool notify(QObject* r, QEvent* e) //该函数用于分发事件
②、int exec(); //使用该函数进入事件主循环。
③、void postEvent(QObject* r, QEvent* e, int priority=Qt::NormalEventPriority); //用于发布自定义事件
④、bool sendEvent(QObject* r, QEvent *e); //用于发送自定义事件
4、QWidget类
①、void grabKeyboard() //捕获键盘输入
②、void grabMouse() //捕获鼠标输入
③、void grabMouse(const QCursor& c); //捕获鼠标输入
④、QWidget* keyboardGrabber(); //返回捕获键盘输入的部件
⑤、QWidget* mouseGrabber(); //返回捕获鼠标输入的部件
⑥、void releaseMouse() //释放捕获的鼠标输入
⑦、void releaseKeyboard() //释放捕获的键盘输入。
⑧、bool hasMouseTracking() const; //是否启用鼠标跟踪
⑨、void setMouseTracking(bool enable) //设置鼠标跟踪状态
⑩、bool underMouse() const; //部件是否位于鼠标光标之下
11、void setAttribute ( Qt::WidgetAttribute attribute, bool on=true); //设置是否启用键压缩。
12、bool testAttribute(Qt::WidgetAttribute attribute) const //返回是否启用了键压缩。
5、本小节学习到的枚举类型
①、Qt::WidgetAttribute枚举的枚举值WA_KeyCompression(键压缩)
②、Qt::KeyboardModifier //描述键盘修饰键(即Alt、Ctrl、Shift等键)
③、Qt::MouseButton //描述鼠标信息(比如按下的是鼠标左键、右键或中键等)
④、Qt::MouseEventSource //描述鼠标事件的来源(比如鼠标事件来源于真正的鼠标还是由触摸屏仿真的)
⑤、Qt::Key //描述键盘的键代码。
6、以及QMouseEvent和QKeyEvent类中
QtWidgets模块继承关系图