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)
GroupSwitchModifier Mode 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_Escape 0x01000000 Esc键
Qt::Key_Tab 0x01000001 Tab键
Qt::Key_Backtab 0x01000002 Tab补全键
Qt::Key_Backspace 0x01000003 退格键
Qt::Key_Return 0x01000004 Return键
Qt::Key_Enter 0x01000005 回车键
Qt::Key_Insert 0x01000006 Insert键
Qt::Key_Delete 0x01000007 Delete键
Qt::Key_Pause 0x01000008 暂停键
Qt::Key_Print 0x01000009 截图键
Qt::Key_SysReq 0x0100000a PrtSc
Qt::Key_Clear
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值