Qt获取组合键
2015-12-14 13:24
477 查看
转载自:http://www.cnblogs.com/codingmylife/archive/2010/08/30/1812739.html
CTRL+Enter发送信息的实现
在现在的即时聊天程序中,一般都设置有快捷键来实现一些常用的功能,类似QQ可以用CTRL+Enter来实现信息的发送。
在QT4中,所有的事件都继承与QEvent这个类,以下是用QEvent来实现快捷键的功能。
首先所有QT类的基类QObject有一个成员函数installEventFilter,这个函数是用来将一个事件处理器和该QObject绑定起来,所以就有了我下面的想法。
首先在chat类定义一个eventFilter,该函数是一个虚函数,可以由子类进行更改。所以声明eventFilter如下:
virtualbooleventFilter(QObject*obj,QEvent*e);
看了下QT文档对于这个函数的声明的解释,大概意思就是如果你要过滤某个事件就返回false,如果要使用某个事件就返回true。
我想在这个函数中加入对Enter键和Ctrl+Enter组合键的判断,具体查看QKeyEvent类的文档
QKeyEvent类中有函数key和modifier,key函数返回的是发生时间的按键值,modifier返回的而是修饰键,QT所支持的修饰键如下:
ConstantValueDescription
Qt::NoModifier0x00000000Nomodifierkeyispressed.
Qt::ShiftModifier0x02000000AShiftkeyonthekeyboardispressed.
Qt::ControlModifier0x04000000ACtrlkeyonthekeyboardispressed.
Qt::AltModifier0x08000000AnAltkeyonthekeyboardispressed.
Qt::MetaModifier0x10000000AMetakeyonthekeyboardispressed.
Qt::KeypadModifier0x20000000Akeypadbuttonispressed.
Qt::GroupSwitchModifier0x40000000X11only.AMode_switchkeyonthekeyboardispressed.
所以可以重写eventFilter函数来实现快捷键的功能,可以根据QKeyEvent的key和modifire来分别是Enter还是Ctrl+enter被按下。
重写eventFilter的函数如下:
然后把这个过滤器用installEventFilter函数安装在聊天窗口的输入框上(QTextEdit),这样就实现快捷键的功能了。
三键组合Shift+Ctrl+A的实现
只要在窗体中相应keyPressEvent事件函数即可。
键盘按住Ctrl键+鼠标左键的实现
在窗体中相应mousePressEvent事件函数在其中检测Ctrl键是否按住即可。
CTRL+Enter发送信息的实现
在现在的即时聊天程序中,一般都设置有快捷键来实现一些常用的功能,类似QQ可以用CTRL+Enter来实现信息的发送。
在QT4中,所有的事件都继承与QEvent这个类,以下是用QEvent来实现快捷键的功能。
首先所有QT类的基类QObject有一个成员函数installEventFilter,这个函数是用来将一个事件处理器和该QObject绑定起来,所以就有了我下面的想法。
首先在chat类定义一个eventFilter,该函数是一个虚函数,可以由子类进行更改。所以声明eventFilter如下:
virtualbooleventFilter(QObject*obj,QEvent*e);
看了下QT文档对于这个函数的声明的解释,大概意思就是如果你要过滤某个事件就返回false,如果要使用某个事件就返回true。
我想在这个函数中加入对Enter键和Ctrl+Enter组合键的判断,具体查看QKeyEvent类的文档
QKeyEvent类中有函数key和modifier,key函数返回的是发生时间的按键值,modifier返回的而是修饰键,QT所支持的修饰键如下:
ConstantValueDescription
Qt::NoModifier0x00000000Nomodifierkeyispressed.
Qt::ShiftModifier0x02000000AShiftkeyonthekeyboardispressed.
Qt::ControlModifier0x04000000ACtrlkeyonthekeyboardispressed.
Qt::AltModifier0x08000000AnAltkeyonthekeyboardispressed.
Qt::MetaModifier0x10000000AMetakeyonthekeyboardispressed.
Qt::KeypadModifier0x20000000Akeypadbuttonispressed.
Qt::GroupSwitchModifier0x40000000X11only.AMode_switchkeyonthekeyboardispressed.
所以可以重写eventFilter函数来实现快捷键的功能,可以根据QKeyEvent的key和modifire来分别是Enter还是Ctrl+enter被按下。
重写eventFilter的函数如下:
boolWindow::eventFilter(QObject*obj,QEvent*e)
{
Q_ASSERT(obj==ui.inputMsgEdit);
if(e->type()==QEvent::KeyPress)
{
QKeyEvent*event=static_cast<QKeyEvent*>(e);
if(event->key()==Qt::Key_Return&&(event->modifiers()&Qt::ControlModifier))
{
sendMessage();
returntrue;
}
}
returnfalse;
}
然后把这个过滤器用installEventFilter函数安装在聊天窗口的输入框上(QTextEdit),这样就实现快捷键的功能了。
三键组合Shift+Ctrl+A的实现
只要在窗体中相应keyPressEvent事件函数即可。
voidWindow::keyPressEvent(QKeyEvent*e)
{
if(e->modifiers()==(Qt::ShiftModifier|Qt::ControlModifier)&&e->key()==Qt::Key_A)
{
//pressed
}
}
键盘按住Ctrl键+鼠标左键的实现
在窗体中相应mousePressEvent事件函数在其中检测Ctrl键是否按住即可。
voidWindow::mousePressEvent(QMouseEvent*e)
{
//获取鼠标在点击窗体上的坐标
QPointpos=e->pos();
if(e->button()==LeftButton)
{
if(QApplication::keyboardModifiers()==Qt::ControlModifier)
{
//pressed
}
}
}
相关文章推荐
- Qt学习(8)
- InventSum Closed and ClosedQty
- 自学QT之遍历文件夹下文件(并且输出到表格中)
- qt初级错误:头文件中定义,cpp未实现
- QTP使用问题集锦
- QT初级错误:继承于QMainwindow的窗口需调用setCentralWidget
- Qt学习之QTableView和QTableWidget的具体区别
- linux中内核、opencv、Qt各种软件版本查询
- QT图表绘制
- 自己重新实现QTP封装的一些常用的方法
- Qt中文乱码问题
- PyQt中QFileDialog记录上次打开目录(历史目录)的方法
- VS2010 + QT5.2+ QT-VS-Addin1.2.2开发环境配置
- Qt学习——qt文件信息的获取
- 《Qt 实战一二三》
- 《Qt 实战一二三》
- Qt标准对话框之QMessageBox
- Qt之国际化
- Qt之国际化
- qt程序中hid问题记录