一、鼠标事件
鼠标事件包括鼠标的移动,鼠标键按下、松开、单击、双击和滚轮事件等。
在实际使用中,只需重定义QWidget的三个鼠标事件方法,即mouseMoveEvent
、mousePressEvent
、mouseReleaseEvent
、mouseDoubleClickEvent
和wheelEvent(QWheelEvent *event)
void MouseEvent::mousePressEvent(QMouseEvent *e)
{
if(e->button() == Qt::LeftButton)
{
//按下了鼠标左键
}
else if(e->button() == Qt::RightButton)
{
//按下了鼠标右键
}
else if(e->button() == Qt::MidButton)
{
//按下了鼠标中键
}
}
void MouseEvent::mouseMoveEvent(QMouseEvent *e)
{
}
void MouseEvent::mouseReleaseEvent(QMouseEvent *e)
{
}
void MouseEvent::mouseDoubleClickEvent(QMouseEvent *e)
{
}
void MouseEvent::wheelEvent(QWheelEvent *event)
{
if(event->dalta() > 0)
{
//滚轮往前滚动
}
else
{
//滚轮往后滚动
}
}
二、键盘事件
键盘事件的获取是通过重定义QWidget类的keyPressEvent()
和keyReleaseEvent()
来实现的。
// 键盘按下事件
void Widget::keyPressEvent(QKeyEvent * event)
{
// 普通键
switch (event->key())
{
// ESC键
case Qt::Key_Escape:
qDebug() <<"ESC";
break;
// 回车键
case Qt::Key_Return:
qDebug() <<"Enter";
break;
// F1键
case Qt::Key_F1:
qDebug() <<"F1";
break;
}
// 两键组合
if(event->modifiers() == Qt::ControlModifier) { // 如果按下了CTRL键
if(event->key() == Qt::Key_M){
qDebug()<<"CTRL + M";
}
}
if(event->modifiers() == Qt::AltModifier) { // 如果按下了ALT键
if(event->key() == Qt::Key_M)
qDebug()<<"ALT + M";
}
if(event->modifiers() == Qt::ShiftModifier){ // 如果按下了Shift键
if(event->key() == Qt::Key_M)
qDebug()<<"Shift + M";
}
// 三键组合Shift + Ctrl + A的实现
if (event->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier) && event->key() == Qt::Key_A) {
qDebug() << "CTRL + Shift + A";
}
}
// 键盘释放事件
void Widget::keyReleaseEvent(QKeyEvent *event)
{
// 方向UP键
if(event->key() == Qt::Key_Up)
{
qDebug() << "release: "<< "up";
}
}
(a) if(event->modifiers()==Qt::ControlModifier):判断修饰键Ctrl是否按下。Qt::KeyboardModifier定义了一系列修饰键,如下所示:
修饰键 | 说明 |
---|---|
Qt::NoModifier | 没有修饰键按下 |
Qt::ShiftModifier | Shift键按下 |
Qt::ControlModifier | Ctrl键按下 |
Qt::AltModifier | Alt键按下 |
Qt::MetaModifier | Meta键按下 |
Qt::KeypadModifier | 小键盘按键按下 |
Qt::GroupSwitchModifier | Mode switch键按下 |
三、事件过滤
Qt的事件模型中提供的事件过滤功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器,可以在事件到达该对象前捕获事件,从而起到监视该对象事件的作用。
步骤:
1、为对象安装事件过滤器
label1->installEventFilter(this);
label2->installEventFilter(this);
label3->installEventFilter(this);
QObject的remoeEventFilter()
函数可以解除以安装的事件过滤器。
2、重写QObject的事件监视函数
bool eventFilter(QObject *watched,QEvent *event)
{
if(watched==label1)
{
if(event->type()==QEvent::MouseButtonPress)
{
//将事件event转化为鼠标事件
QMouseEvent *mouseEvent=(QMouseEvent *)event;
}
if(mouseEvent->buttons() & Qt::LeftButton) //鼠标点击事件
{
}
else if(mouseEvent->buttons() & Qt::RightButton)
{
}
else if(mouseEvent->buttons() & Qt::MidButton)
{
}
if(mouseEvent->type()==QEvent::MouseButtonRelease) //鼠标释放事件
{
}
}
else if(watched==label2)
{
}
else if(watched==label3)
{
}
}