zoukankan      html  css  js  c++  java
  • Qt获取组合键

    CTRL+Enter发送信息的实现

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

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

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

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

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

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

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

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

    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.

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

          重写eventFilter的函数如下:

    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;
    }

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

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

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

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

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

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

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

    转载原文

  • 相关阅读:
    Python 存储引擎 数据类型 主键
    Python 数据库
    Python 线程池进程池 异步回调 协程 IO模型
    Python GIL锁 死锁 递归锁 event事件 信号量
    Python 进程间通信 线程
    Python 计算机发展史 多道技术 进程 守护进程 孤儿和僵尸进程 互斥锁
    Python 异常及处理 文件上传事例 UDP socketserver模块
    Python socket 粘包问题 报头
    Django基础,Day7
    Django基础,Day6
  • 原文地址:https://www.cnblogs.com/codingmylife/p/1812739.html
Copyright © 2011-2022 走看看