首页 > 其他 > 详细

Qt 组合键的实现

时间:2014-05-05 11:24:26      阅读:577      评论:0      收藏:0      [点我收藏+]

(转自:http://blog.csdn.net/zerokkqq/article/details/6686912)

CTRL+Enter发送信息的实现

      在现在的即时聊天程序中,一般都设置有快捷键来实现一些常用的功能,类似QQ可以用CTRL+Enter来实现信息的发送。

      在QT4中,所有的事件都继承与QEvent这个类,以下是用QEvent来实现快捷键的功能。

      首先所有QT类的基类QObject有一个成员函数installEventFilter,这个函数是用来将一个事件处理器和该QObject绑定起来,所以就有了我下面的想法。

      首先在chat类定义一个eventFilter,该函数是一个虚函数,可以由子类进行更改。所以声明eventFilter如下:

1
virtual bool eventFilter(QObject *obj, QEvent *e);

  看了下QT文档对于这个函数的声明的解释,大概意思就是如果你要过滤某个事件就返回false,如果要使用某个事件就返回true。

      我想在这个函数中加入对Enter键和Ctrl+Enter组合键的判断,具体查看QKeyEvent类的文档

      QKeyEvent类中有函数key和modifier,key函数返回的是发生时间的按键值,modifier返回的而是修饰键,QT所支持的修饰键如下:

bubuko.com,布布扣
Constant                    Value            Description

Qt::NoModifier              0x00000000       No modifier key is pressed.

Qt::ShiftModifier           0x02000000       A Shift key on the keyboard is pressed.

Qt::ControlModifier         0x04000000       A Ctrl key on the keyboard is pressed.

Qt::AltModifier             0x08000000       An Alt key on the keyboard is pressed.

Qt::MetaModifier            0x10000000       A Meta key on the keyboard is pressed.

Qt::KeypadModifier          0x20000000       A keypad button is pressed.

Qt::GroupSwitchModifier     0x40000000       X11 only. A Mode_switch key on the keyboard is pressed.
bubuko.com,布布扣

      所以可以重写eventFilter函数来实现快捷键的功能,可以根据QKeyEvent的key和modifire来分别是Enter还是Ctrl+enter被按下。

      重写eventFilter的函数如下:

bubuko.com,布布扣
bool Window::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();
            return true;
        }
    }
    return false;
}
bubuko.com,布布扣

  然后把这个过滤器用installEventFilter函数安装在聊天窗口的输入框上(QTextEdit),这样就实现快捷键的功能了。

三键组合Shift + Ctrl + A的实现

      只要在窗体中相应keyPressEvent事件函数即可。

bubuko.com,布布扣
void Window::keyPressEvent(QKeyEvent *e)
{
    if (e->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier) && e->key() == Qt::Key_A)
    {
        //pressed
    }
}
bubuko.com,布布扣

键盘按住Ctrl键 + 鼠标左键的实现

      在窗体中相应mousePressEvent事件函数在其中检测Ctrl键是否按住即可。

bubuko.com,布布扣
void Window::mousePressEvent(QMouseEvent *e)
{
    // 获取鼠标在点击窗体上的坐标
    QPoint pos = e->pos();
    if (e->button() == LeftButton)
    {
        if ( QApplication::keyboardModifiers () == Qt::ControlModifier)
        {
            //pressed
        }
    }
}
bubuko.com,布布扣

 

Qt 组合键的实现,布布扣,bubuko.com

Qt 组合键的实现

原文:http://www.cnblogs.com/FindSelf/p/3706089.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!