鼠标事件及滚轮事件
前言
QMouseEvent类用于表示一个鼠标事件,当按下鼠标或者移动鼠标时就会产生鼠标事件,利用QMouseEvent类可以获取鼠标时哪个键给按下了
QWheelEvent类用于表示鼠标滚轮事件,在这个类中主要是获取滚轮移动的方向和距离
我们就用一个实际例子来重写下鼠标和滚轮事件
代码实现
需求:
1.把鼠标的型状改为小手
2.双击使窗口全屏和缩小
3.鼠标移动来拖动窗口
4.对文本框中的内容通过滚轮进行内容的放大和缩小
5.点击右键把指针变成一个自定义的图片
6.释放鼠标时鼠标形状恢复(变成原来的小手)
需要在ui界面先放一个TextEdit
头文件中声明对应各个方法:
protected:
void mousePressEvent(QMouseEvent *event); //鼠标按下事件
void mouseReleaseEvent(QMouseEvent *event); //鼠标释放事件
void mouseDoubleClickEvent(QMouseEvent *event); //鼠标双击事件
void mouseMoveEvent(QMouseEvent *event); //鼠标移动事件
void wheelEvent(QWheelEvent *event); //滚轮事件
widget构造函数
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QCursor cursor; //创建光标对象
cursor.setShape(Qt::OpenHandCursor);//设置光标形状(小手)
setCursor(cursor); //使用光标
}
接下来就是主要大的鼠标事件以及滚轮事件了看代码:
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton){ //左键按下
QCursor cursor;
cursor.setShape(Qt::UpArrowCursor);
QApplication::setOverrideCursor(cursor);//使鼠标指针暂时改变形状
offset=event->globalPos()-pos(); //获取指针位置和窗口位置的差值
qDebug()<<"Pressoffset"<<offset;
}
else if(event->button()==Qt::RightButton)//如果是右键按下
{
QCursor cursor(QPixmap("../background_1.png"));
QApplication::setOverrideCursor(cursor);//使用自定义的图片作为鼠标指针
}
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
QApplication::restoreOverrideCursor();
}
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton){
if(windowState()!=Qt::WindowFullScreen){
setWindowState(Qt::WindowFullScreen);
}else{
setWindowState(Qt::WindowNoState);
}
}
}
//鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons()&Qt::LeftButton){ //必须要用到buttons();
QPoint temp;
temp=event->globalPos()-offset;
qDebug()<<"Moveoffset"<<offset;
move(temp); //使用鼠标指针当前的位置减去差值就得到了窗口应该移动的位置
}
}
//滚轮事件
void Widget::wheelEvent(QWheelEvent *event)
{
if(event->delta()>0){ //滚轮向我们走远
ui->textEdit->zoomIn(); //放大
}else{ //滚轮向我们靠近
ui->textEdit->zoomOut(); //缩小
}
}
对于移动事件为什么要用到buttons()而不是button()呢?
可以这样理解因为鼠标移动时会检测所有按下的按键(我们这里是左键一直按着),而button()不能检测,比如我们原来是一直按着左键的然后我们移动检测到的会是Qt::NoButton(仅仅检测当前这一下子是否有按下键)这是不行的,所以我们得用buttons()(这个可以检测到当前所有有按下的按键)然后&Qt::LeftButton看按下的键中有没有左键。
对于移动的为什么是
QPoint temp;
temp=event->globalPos()-offset;
qDebug()<<"Moveoffset"<<offset;
move(temp);
看图:
运行结果
一:正常情况
二:滚轮效果
三:双击全屏
四:右键把鼠标样式变成自己定义的图片
五:释放鼠标(鼠标还原变成小手)