参考文献:《Qt Creator 快速入门》第三版 霍亚飞编著
QMouseEvent类用来表示一个鼠标事件,在窗口部件中按下鼠标或者移动鼠标指针时都会产生鼠标事件。
QWheelEvent类用来表示鼠标滚轮事件,主要用来获取滚轮移动的放下和距离。
直接上栗子,实现功能:在界面上按着鼠标左键拖动窗口,双击鼠标左键全屏,按着鼠标右键使之称为一个自定义图标,使用滚轮放大缩小编辑器的内容。
新建Qt Widgets应用,项目名为mymouseevent,基类选择QWidget,类名保存Widget不变。在设计模式下,拖入一个TextEdit,然后在widget.h中添加函数声明如下。
protected:
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
void mouseDoubleClickEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);
再添加一个位置变量如下
private:
QPoint offset;
在widget.cpp函数中添加头文件#include <QMouseEvent >,并在构造函数中,添加以下代码。
QCursor cursor;//创建光标对象
cursor.setShape(Qt::OpenHandCursor);//设置光标形状
setCursor(cursor);//使用光标
然后实现头文件中声明的几个事件处理函数如下
void Widget::mousePressEvent(QMouseEvent *event)//鼠标按下事件
{
if(event->button()==Qt::LeftButton)//如果是鼠标左键按下
{
QCursor cursor;
cursor.setShape(Qt::ClosedHandCursor);
QApplication::setOverrideCursor(cursor);//使鼠标指针暂时改变形状
offset=event->globalPos()-pos();//获取指针位置和窗口位置的差值
}else if(event->button()==Qt::RightButton)//如果是鼠标右键按下
{
QCursor cursor(QPixmap("../mymouseevent/logo.png"));
QApplication::setOverrideCursor(cursor);//使用自定义的图标作为鼠标指针
}
}
鼠标按下事件,左键按改变指针形状,并记下当前指针位置与窗口位置的差值。右键按下,指针显示为自定义图标。
void Widget::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件
{
if(event->buttons()&Qt::LeftButton)
{
QPoint temp;
temp=event->globalPos()-offset;
move(temp);//使用鼠标当前的位置减去差值,就得到了窗口应该移动的位置
}
}
鼠标移动处理事件。因为鼠标移动时会检测所有按下的键,所以这时候使用button()函数无法获得哪个按键被按下,只能使用Buttons函数与Qt::LeftButton安位与来判断左键是否按下。
void Widget::mouseReleaseEvent(QMouseEvent *event)//鼠标释放事件
{
Q_UNUSED(event);
QApplication::restoreOverrideCursor();//恢复鼠标指针形状
}
鼠标释放事件函数,使用restoreOverrideCursor()函数恢复鼠标指针形状。
void Widget::mouseDoubleClickEvent(QMouseEvent *event)//鼠标双击事件
{
if(event->button()==Qt::LeftButton)//如果是鼠标左键按下
{
if(windowState()!=Qt::WindowFullScreen)//如果窗口不是全屏
setWindowState(Qt::WindowFullScreen);//将窗口设置位全屏
else
setWindowState(Qt::WindowNoState);//恢复窗口以前大小
}
}
鼠标双击事件处理函数,使用setWindowState()函数处理窗口状态。
void Widget::wheelEvent(QWheelEvent *event)//滚轮事件
{
if(event->delta()>0)//当滚轮远离使用者时
ui->textEdit->zoomIn();//放大
else
ui->textEdit->zoomOut();//缩小
}
滚轮事件处理函数。当滚轮向远离使用者旋转时,返回负值,当滚轮向靠近使用者旋转时返回正值。zoomIn和zoomOut函数实现放大缩小。
运行代码查看效果,如下图分别是程序启动后,单击鼠标左键,右击鼠标,移动窗口,放大缩小