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 |