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

    http://cool.worm.blog.163.com/blog/static/643390062009614248349/

  • 相关阅读:
    Direct2D 变换
    DWrite 文字
    Windows基础窗体编程
    .net delegate(委托类型)
    详说new和overrid区别
    类与结构区别
    IIS的Gzip压缩
    ASP.NET 状态服务和session丢失问题解决方案
    Fiddler使用
    Castle系列教程(转)
  • 原文地址:https://www.cnblogs.com/findumars/p/6250730.html
Copyright © 2020-2023  润新知