使用QT的鼠标事件和滚轮事件

----完成鼠标左键拖动窗口,双击全屏,滚轮放大缩小窗口大小
这里使用的是QMouseEvent类里面的鼠标事件,通常进行重定义部件的鼠标事件处理函数来实现自定义的内容操作。同样,鼠标滚轮操作是利用QWheelEvent实现滚轮事件。
其中:

  1. voidmousePressEvent(QMouseEvent *event);这个是鼠标按下的时候调用该函数
  2. voidmouseReleaseEvent(QMouseEvent *event);这个是鼠标松开按键的时候调用
  3. voidmouseDoubleClickEvent(QMouseEvent *event);这个是鼠标双击的时候调用
  4. voidmouseMoveEvent(QMouseEvent *event);这个是鼠标按下状态中,移动的时候调用
  5. void wheelEvent(QWheelEvent*event); 这个是鼠标上下滚轮的时候会调用
    上述鼠标事件并不完全,但是对于一般我们使用完全足够了。
    通过重定义上述函数来实现鼠标、滚轮操作后的自定义的内容处理。

现在我们来通过一个具体的程序来看看如何实现的。
首先,新建工程。我们先新建一个QT Gui应用,项目名称我命名为QtEvent,其他的全部默认。
第二步,添加头文件与变量。我们在mainwindows.h里添加头文件:
#include
#include
然后再添加:

  1. protected:

  2. voidmousePressEvent(QMouseEvent*event);//按下

  3. voidmouseMoveEvent(QMouseEvent*event);//按下移动

  4. voidmouseReleaseEvent(QMouseEvent*event);//松开

  5. voidmouseDoubleClickEvent(QMouseEvent*event);//双击

  6. voidwheelEvent(QWheelEvent*event);//滚轮

  7. private:

  8. QPointoffset;//储存鼠标指针位置与窗口位置的差值

  9. QCursorcursor;//创建光标,保存默认光标形状
    其中offset是为了窗口拖动的需要的变量,用于存储鼠标指针位置和窗口位置之间的差值,cursor是为了保存默认光标形状,当拖动窗口的时候光标变为手掌,表示进入拖动状态,如果需要自定义光标图标,也可以用QCursor类。
    第三步,重定义上述声明的鼠标滚轮函数。
    代码如下:

  10. void MainWindow::mousePressEvent(QMouseEvent*event){

  11. if(event->buttons()==Qt::LeftButton){//如果鼠标按下的是左键

  12. //则改变鼠标形状为手掌,表示拖动状态。

  13. QCursorcursor1;//创建光标对象

  14. cursor1.setShape(Qt::OpenHandCursor);//设置光标形态

  15. setCursor(cursor1);//使用手掌光标

  16. //这里获取指针位置和窗口位置的差值

  17. offset=event->globalPos()-this->pos();

  18. }

  19. }

  20. void MainWindow::mouseMoveEvent(QMouseEvent*event){

  21. if(event->buttons()==Qt::LeftButton){//如果鼠标按下的是左键

  22. QPointtmp;

  23. tmp=event->globalPos()-offset;

  24. move(tmp);

  25. }

  26. }

  27. void MainWindow::mouseReleaseEvent(QMouseEvent*event){

  28. //拖动完成后,光标恢复默认形状

  29. setCursor(cursor);

  30. //或者直接用自带恢复鼠标指针形状的函数为:QApplication::restoreOverrideCursor();

  31. //但是需要前面设置哪个是默认的光标形状,用这个函数setOverrideCursor()函数

  32. }

  33. void MainWindow::mouseDoubleClickEvent(QMouseEvent*event){

  34. if(event->buttons()==Qt::LeftButton){//如果鼠标按下的是左键

  35. if(windowState()!=Qt::WindowFullScreen)//如果窗口不是全屏,则让它全屏

  36. setWindowState(Qt::WindowFullScreen);

  37. else

  38. setWindowState(Qt::WindowNoState);//否则恢复以前的大小

  39. }

  40. }

  41. void MainWindow::wheelEvent(QWheelEvent*event){

  42. QRecttmp=this->geometry();//获取窗口的位置以及大小并保存在tmp中。

  43. if(event->delta()>0){//如果滚轮往上滚

  44. tmp.setWidth(tmp.width()+25);//设置宽度为原有基础上+25

  45. tmp.setHeight(tmp.height()+15);//设置窗口高度为原有基础上+20

  46. this->setGeometry(tmp);//然后设置窗口大小。

  47. }else{//同样的

  48. tmp.setWidth(tmp.width()-25);

  49. tmp.setHeight(tmp.height()-15);

  50. //如果缩小之后的窗口不小于设置的最小窗口尺寸,则执行缩放。

  51. if(this->minimumSize().height()<tmp.height()&&this->minimumSize().width()<tmp.width())

  52. this->setGeometry(tmp);

  53. }

  54. }

第四步,最终执行代码:

同样的,如果需要用到键盘监听,步骤跟鼠标监听是一个性质,这里就不再描述。

这里需要注意的是:全屏模式是会把标题栏都屏蔽掉的,相当于全屏打游戏的那种全屏,如果只需要实现最大化的功能,那么只需要把WindowFullScreen改为WindowMaximized就可以了。

以上代码还可以继续改进:譬如当全屏或者最大化的时候还可以拖动窗口,这显然是不合理的,所以需要进一步在mousePressEvent()和mouseMoveEvent()添加判断,如果为全屏/最大化模式,则不允许拖动。
修改代码如下:
………
…….
…….
if(event->buttons()==Qt::LeftButton&&windowState()!=Qt::WindowMaximized&&windowState()!=Qt:: WindowFullScreen){
………
}
最后就完善了改进。

如果你觉得系统自带的标题栏太丑或者不符合口味,你可以根据上面的知识自己屏蔽标题栏,然后实现添加或修改最小化、最大化、关闭按钮的个性化外观,最后完成一个如画如诗意一般的窗口。

来自 https://blog.csdn.net/a3631568/article/details/53898457
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以通过重写QWidget类中的鼠标事件函数来处理鼠标事件,包括鼠标点击、移动、释放等。常用的鼠标事件函数有: - mousePressEvent(QMouseEvent *event):鼠标按下事件 - mouseMoveEvent(QMouseEvent *event):鼠标移动事件 - mouseReleaseEvent(QMouseEvent *event):鼠标释放事件 另外,在处理鼠标移动事件时,可以通过调用QWidget类中的setMouseTracking(bool enable)函数来开启或关闭鼠标跟踪功能,以便在鼠标移动时及时获取鼠标位置信息。 而处理鼠标滚轮事件,可以通过重写QWidget类中的wheelEvent(QWheelEvent *event)函数来实现。在该函数中,可以通过QWheelEvent类提供的delta()函数获取鼠标滚轮滚动的距离。 下面是一个简单的例子,演示了如何在QWidget窗口中处理鼠标事件滚轮事件: ```cpp #include <QtWidgets> class MyWidget : public QWidget { public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { setMouseTracking(true); // 开启鼠标跟踪功能 } protected: void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { qDebug() << "Left button pressed at" << event->pos(); } } void mouseMoveEvent(QMouseEvent *event) override { qDebug() << "Mouse moved to" << event->pos(); } void mouseReleaseEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { qDebug() << "Left button released at" << event->pos(); } } void wheelEvent(QWheelEvent *event) override { qDebug() << "Mouse wheel rotated by" << event->delta(); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.show(); return app.exec(); } ``` 在上面的例子中,我们重写了QWidget类中的mousePressEvent()、mouseMoveEvent()、mouseReleaseEvent()和wheelEvent()函数,分别处理鼠标按下、移动、释放和滚轮事件。同时,在构造函数中调用了setMouseTracking(true)函数开启鼠标跟踪功能。最后创建了一个MyWidget对象并显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值