Qt事件处理

1. 鼠标事件:

鼠标事件包含移动、按下、松开、单机、双击等。

void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void mouseDoubleClickEvent(QMouseEvent *e);

QMouseEvent 类的e->x()和e->y()方法,可以获取鼠标相对于接受事件的窗体位置(相对位置);e->globalX()和e->globalY()方法可以获取鼠标相对窗口的系统位置。

e->button()方法区分鼠标按键的类型。

void MouseEvent::mousePressEvent(QMouseEvent *e)
{
    QString str="("+QString::number(e->x())+","+QString::number(e->y()) +")";  
    if(e->button()==Qt::LeftButton)   {
        statusBar()->showMessage(QStringLiteral("左键:")+str);
    }
    else if(e->button()==Qt::RightButton)   {
        statusBar()->showMessage(tr("右键:")+str);
    }
    else if(e->button()==Qt::MidButton)  {
        statusBar()->showMessage(tr("中键:")+str);
    }
}

2. 键盘事件:

void keyPressEvent(QKeyEvent *e);

QKeyEvent 类的e->modifiers()(Qt::KeyboardModifiers modifiers()),判断修饰键是否按下;e->key()方法判断其他键是否按下。

KeyboardModifiers 枚举值:

 NoModifier 没有修饰键按下
ShiftModifier【Shift】键按下
ControlModifier 【Ctrl】键按下
AltModifier    【Alt】键按下
MetaModifier  Meta键按下,(Meta 是Sun系统下的,也和WIN键一样)
KeypadModifier小键盘上的键按下(例如Keypad0小键盘0,Keypad1小键盘1)
GroupSwitchModifierMode Switch键按下
KeyboardModifierMask

event->key()的枚举值Key见文章最后的表格。

3. 事件过滤:

Qt的事件模型中提供的事件过滤器功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器,可以在事件到达该对象前捕获事件,从而起到监视对象事件的效果。

EventFilter::EventFilter(QWidget *parent,Qt::WindowFlags f)
    : QDialog(parent,f)
{
    setWindowTitle(tr("事件过滤"));
    label1 = new QLabel;
    label1->installEventFilter(this); // 安装事件过滤器,指定窗体(this)为监视事件的对象
}

监视事件的对象通过eventFilter()函数接收事件。如果某个事件需要被过滤掉,即停止正常的事件响应,则在eventFilter()函数中返回true,否则返回false;

QObject的removeEventFilter()可以解除已安装的事件过滤器。

bool EventFilter::eventFilter(QObject *watched, QEvent *event)
{
    if(watched==label1)            //首先判断当前发生事件的对象
    {
        if(event->type()==QEvent::MouseButtonPress) //判断发生的事件类型
        {
            //将事件event转化为鼠标事件
            QMouseEvent *mouseEvent=(QMouseEvent *)event;
            /* 以下根据鼠标的按键类型分别显示 */
            if(mouseEvent->buttons()&Qt::LeftButton)      {
                stateLabel->setText(tr("左键按下左边图片"));
            }
            else if(mouseEvent->buttons()&Qt::MidButton)     {
                stateLabel->setText(tr("中键按下左边图片"));
            }
            else if(mouseEvent->buttons()&Qt::RightButton)    {
                stateLabel->setText(tr("右键按下左边图片"));
            }
            /* 显示缩小的图片 */
            QMatrix matrix;
            matrix.scale(1.8,1.8);
            QImage tmpImg=Image1.transformed(matrix);
            label1->setPixmap(QPixmap::fromImage(tmpImg));
        }
        /* 鼠标释放事件的处理,恢复图片的大小 */
        else  if (event->type()==QEvent::MouseButtonRelease)
        {
            stateLabel->setText(tr("鼠标释放左边图片"));
            label1->setPixmap(QPixmap::fromImage(Image1));
        }
    }
    //将事件交给上层对话框
    return QDialog::eventFilter(watched,event);
}

QKeyEvent的Key枚举值:

Qt::Key_Escape0x01000000Esc键
Qt::Key_Tab0x01000001Tab键
Qt::Key_Backtab0x01000002Tab补全键
Qt::Key_Backspace0x01000003退格键
Qt::Key_Return0x01000004Return键
Qt::Key_Enter0x01000005回车键
Qt::Key_Insert0x01000006Insert键
Qt::Key_Delete0x01000007Delete键
Qt::Key_Pause0x01000008暂停键
Qt::Key_Print0x01000009截图键
Qt::Key_SysReq0x0100000aPrtSc
Qt::Key_Clear0x0100000b清除键
Qt::Key_Home0x01000010Home键
Qt::Key_End0x01000011End键
Qt::Key_Left0x01000012
Qt::Key_Up0x01000013
Qt::Key_Right0x01000014
Qt::Key_Down0x01000015
Qt::Key_PageUp0x01000016上页
Qt::Key_PageDown0x01000017下页
Qt::Key_Shift0x01000020Shift键
Qt::Key_Control0x01000021Ctrl键
Qt::Key_Alt0x01000023Alt键
Qt::Key_AltGr0x01001103右侧Alt
Qt::Key_CapsLock0x01000024大写键
Qt::Key_NumLock0x01000025NumLock
Qt::Key_ScrollLock0x01000026滚动锁定
Qt::Key_F10x01000030F1~F12
Qt::Key_F20x01000031 
Qt::Key_F30x01000032 
Qt::Key_F40x01000033 
Qt::Key_F50x01000034 
Qt::Key_F60x01000035 
Qt::Key_F70x01000036 
Qt::Key_F80x01000037 
Qt::Key_F90x01000038 
Qt::Key_F100x01000039 
Qt::Key_F110x0100003a 
Qt::Key_F120x0100003b 
Qt::Key_Menu0x01000055菜单键
Qt::Key_Help0x01000058Help键
Qt::Key_Space0x20空格键
Qt::Key_Exclam0x21
Qt::Key_QuoteDbl0x22引用
Qt::Key_NumberSign0x23#
Qt::Key_Dollar0x24$
Qt::Key_Percent0x25%
Qt::Key_Ampersand0x26&
Qt::Key_Apostrophe0x27分词符" ' "
Qt::Key_ParenLeft0x28(
Qt::Key_ParenRight0x29
Qt::Key_Asterisk0x2a*
Qt::Key_Plus0x2b+
Qt::Key_Comma0x2c
Qt::Key_Minus0x2d-
Qt::Key_Period0x2e
Qt::Key_Slash0x2f/
Qt::Key_00x30数字0~9
Qt::Key_10x31 
Qt::Key_20x32 
Qt::Key_30x33 
Qt::Key_40x34 
Qt::Key_50x35 
Qt::Key_60x36 
Qt::Key_70x37 
Qt::Key_80x38 
Qt::Key_90x39 
Qt::Key_Colon0x3a:
Qt::Key_Semicolon0x3b;
Qt::Key_Less0x3c<
Qt::Key_Equal0x3d等于
Qt::Key_Greater0x3e>
Qt::Key_Question0x3f
Qt::Key_At0x40@
Qt::Key_A0x41字母键
Qt::Key_B0x42 
Qt::Key_C0x43 
Qt::Key_D0x44 
Qt::Key_E0x45 
Qt::Key_F0x46 
Qt::Key_G0x47 
Qt::Key_H0x48 
Qt::Key_I0x49 
Qt::Key_J0x4a 
Qt::Key_K0x4b 
Qt::Key_L0x4c 
Qt::Key_M0x4d 
Qt::Key_N0x4e 
Qt::Key_O0x4f 
Qt::Key_P0x50 
Qt::Key_Q0x51 
Qt::Key_R0x52 
Qt::Key_S0x53 
Qt::Key_T0x54 
Qt::Key_U0x55 
Qt::Key_V0x56 
Qt::Key_W0x57 
Qt::Key_X0x58 
Qt::Key_Y0x59 
Qt::Key_Z0x5a 
Qt::Key_BracketLeft0x5b[
Qt::Key_Backslash0x5c\
Qt::Key_BracketRight0x5d]
Qt::Key_AsciiCircum0x5e^
Qt::Key_Underscore0x5f_
Qt::Key_QuoteLeft0x60
Qt::Key_BraceLeft0x7b{
Qt::Key_Bar0x7c|
Qt::Key_BraceRight0x7d}
Qt::Key_AsciiTilde0x7e~
Qt::Key_nobreakspace0x0a0不换行空格
Qt::Key_exclamdown0x0a1
Qt::Key_cent0x0a2美分
Qt::Key_sterling0x0a3英镑
Qt::Key_currency0x0a4货币
Qt::Key_yen0x0a5日元

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值