`
mmdev
  • 浏览: 12892893 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Qt中mouseMoveEvent和mousePressEvent实现鼠标滑动换label颜色

 
阅读更多

buptyoyo:Qt中mouseMoveEvent和mousePressEvent实现鼠标滑动换label颜色

当鼠标划过上面的一排Label后,鼠标形状变成手状,并且使label自动切换颜色。

很自然的会想到在一个Label上,检测鼠标的mouseMoveEvent事件,当划过label时候,切换到另一个绿色的图片。鼠标的形状可以采用QT自带的Qt::OpenHandCursor。

具体的实现为:

//往一个label添加图片

ui.label_90->setStyleSheet("background-image:url(./pic/1.jpg)");

//添加label的响应事件,clicked1是自定义的信号,page0是自定义的槽

connect(this,SIGNAL(clicked1()),this,SLOT(page0()));

//获取该个label的相关信息,

x1=ui.label_90->x();

y1=ui.label_90->y();

x1width=ui.label_90->width();

y1height=ui.label_90->height();

//设置鼠标跟踪事件

this->setMouseTracking(true);

ui.label_90->setMouseTracking(true);

void ImageWidget1::page0(){

ui.stackedWidget->setCurrentIndex(0);//表示第一个页面,以下类似

}

//鼠标点击事件,根据点击的不同的label确定发出的信号

void ImageWidget1::mousePressEvent(QMouseEvent *event){

if (event->button()==Qt::LeftButton)

{

int x=event->x();

int y=event->y();

if (x>x1&&x<x1+x1width&&y>y1&&y<y1+y1height)

{

emit clicked1();

}

if (x>x2&&x<x2+x2width&&y>y2&&y<y2+y2height)

{

emit clicked2();

}

if (x>x3&&x<x3+x3width&&y>y3&&y<y3+y3height)

{

emit clicked3();

}

if (x>x4&&x<x4+x4width&&y>y4&&y<y4+y4height)

{

emit clicked4();

}

if (x>x5&&x<x5+x5width&&y>y5&&y<y5+y5height)

{

emit clicked5();

}

if (x>x6&&x<x6+x6width&&y>y6&&y<y6+y6height)

{

emit clicked6();

}

}

}

//下面监听鼠标滑动,并获取坐标,判断在哪个label的范围内,根据不同的label重新设置其背景图片,造成 label变色的效果,并且使鼠标变成手状,具有提醒效果。如果在其余的区域,设置label为默认的图片。

void ImageWidget1::mouseMoveEvent(QMouseEvent *event){

int x=event->x();

int y=event->y();

if (x>x2&&x<x2+x2width&&y>y2&&y<y2+y2height)

{

this->setCursor(Qt::OpenHandCursor);

ui.label_91->setStyleSheet("background-image:url(./pic/topo_edit_down.gif)");

}

else if (x>x1&&x<x1+x1width&&y>y1&&y<y1+y1height)

{

this->setCursor(Qt::OpenHandCursor);

ui.label_90->setStyleSheet("background-image:url(./pic/topo_show_down.gif)");

}

else if (x>x3&&x<x3+x3width&&y>y3&&y<y3+y3height)

{

this->setCursor(Qt::OpenHandCursor);

ui.label_92->setStyleSheet("background-image:url(./pic/history_state_down.gif)");

}

else if (x>x4&&x<x4+x4width&&y>y4&&y<y4+y4height)

{

this->setCursor(Qt::OpenHandCursor);

ui.label_105->setStyleSheet("background-image:url(./pic/history_log_down.gif)");

}

else if (x>x5&&x<x5+x5width&&y>y5&&y<y5+y5height)

{

this->setCursor(Qt::OpenHandCursor);

ui.label_106->setStyleSheet("background-image:url(./pic/package_analyze_down.gif)");

}

else if (x>x6&&x<x6+x6width&&y>y6&&y<y6+y6height)

{

this->setCursor(Qt::OpenHandCursor);

ui.label_107->setStyleSheet("background-image:url(./pic/package_control_down.gif)");

}

else{

this->setCursor(Qt::ArrowCursor);

//如果鼠标停在了非上面一排label上,恢复鼠标形状,并设置label为默认图片

ui.label_90->setStyleSheet("background-image:url(./pic/1.jpg)");

ui.label_91->setStyleSheet("background-image:url(./pic/2.jpg)");

ui.label_92->setStyleSheet("background-image:url(./pic/3.jpg)");

ui.label_105->setStyleSheet("background-image:url(./pic/4.jpg)");

ui.label_106->setStyleSheet("background-image:url(./pic/5.jpg)");

ui.label_107->setStyleSheet("background-image:url(./pic/6.jpg)");

}

需要注意的有两点:

1 上面红字标注的地方,这个也是查了好多资料才找到的。

我们先看看Qt的Assistance中关于mouseMoveEvent的描述:

void QWidget::mouseMoveEvent ( QMouseEvent * event ) [virtual protected]

This event handler, for event event, can be reimplemented in a subclass to receive mouse move events for the widget.

If mouse tracking is switched off, mouse move events only occur if a mouse button is pressed while the mouse is being moved. If mouse tracking is switched on, mouse move events occur even if no mouse button is pressed.

QMouseEvent::pos() reports the position of the mouse cursor, relative to this widget. For press and release events, the position is usually the same as the position of the last mouse move event, but it might be different if the user's hand shakes. This is a feature of the underlying window system, not Qt.

If you want to show a tooltip immediately, while the mouse is moving (e.g., to get the mouse coordinates with QMouseEvent::pos() and show them as a tooltip), you must first enable mouse tracking as described above. Then, to ensure that the tooltip is updated immediately, you must call QToolTip::showText() instead of setToolTip() in your implementation of mouseMoveEvent().

See also setMouseTracking(), mousePressEvent(), mouseReleaseEvent(), mouseDoubleClickEvent(), event(), QMouseEvent, and Scribble Example.

注意我上面红色标注的地方,说如果mouseTracking的状态关了,那么必须按着鼠标拖动才能触发。所以,必须要 this->setMouseTracking(true),但如果仅仅这样,也就没什么新奇的了。我也就没必要特别在这写出来。很容易发现,仅仅设置这句是不行的,你如果想让它滑过一个控件,触发某种效果,你就会发现在滑过控件的时候依然需要按着鼠标滑动。原因就在与鼠标发出的事件被控件所截获,所以要对控件设置setMouseTracking才行。这些是参考了一个人的资料,如果没有他的话,估计我现在还没研究出来呢。

呵呵,把他的话也一起贴出来,发现是繁体,可能是台湾同胞?MAYBE。

/////////////////////////////////////////////////////////////////////////////////// 我是传说中的分割线////////////////////////////////////////////////

我以前寫測試程序的時候遇到過這樣的問題。我跟你講下我的情況,希望對你有幫助:

我的測試程序目的是要這樣的,在一個QWidget中,放置了一個QPushButton(非常大),然後在mouseMoveEvent中定義了一個矩形塊,當鼠標移動到矩形塊内部時就變換鼠標樣式,然後使用QWidget::setMouseTracking(true)。結果是,要一直按住鼠標右鍵拖動,才響應mouseMoveEvent裏邊的語句。

最後,發現一個問題,我定義的那個矩形塊是QPushButton的勢力範圍(即這個矩形塊的最頂端的是QPushButton),使用 QPushButton::setMouseTracking(true) 之後,便可正常響應了。所以我覺得,因爲QPushButton是最頂端的物體,所以,mouseMoveEvent事件被QPushButton截獲了。

分享到:
评论

相关推荐

    Qt5开发及实例-CH1101.rar,Qt5获得和处理鼠标事件的代码

    (1)在头文件“mouseevent.h”中,重定义了QWidget类的三个鼠标事件方法,即mouseMoveEvent、mousePressEvent和mouseReleaseEvent。当有鼠标事件发生时,就会响应相应的函数,其具体内容; (2)源文件“mouseevent....

    QT学习之重写鼠标移动事件

    QT平台上,重写mouseMoveEvent和paintEvent实现鼠标移动过程中,实时显示鼠标所在位置坐标的功能,练习demo..

    QT5打地鼠有声版源码

    本程序采用Qmediaplayer类实现播放声音,使用QTime类实现计时器功能,重写了paintEvent,mouseMoveEvent,mousePressEvent,mouseReleaseEvent事件。本人大量缺资源分,因之前发的程序并没有赚分,故此设置了10分的...

    PyQt5追踪鼠标当前位置 移动鼠标和点击鼠标获取坐标

    # PyQt5追踪鼠标当前位置 移动鼠标和点击鼠标获取坐标 1. 简洁明了的代码,帮助快速学习鼠标事件;...2. 重定义mouseMoveEvent事件实现移动鼠标显示坐标; 3. 重定义mousePressEvent事件实现点击鼠标显示坐标。

    Qt 鼠标/触屏绘制平滑曲线(矢量/非矢量)

    而鼠标或者触屏画线也不大一样,通常如果只实现鼠标画线的话,那么只需要重新实现鼠标事件即可(mousePressEvent、mouseMoveEvent、mouseReleaseEvent),而要在触控屏上画线,如果需要支持多点画线的话,就必须处理...

    qt 鼠标拖动案例

    想学习QT的朋友们,对鼠标拖动事件不是很理解的话,可以看看本案例,加深理解mousePressEvent,mouseReleaseEvent,mouseMoveEvent事件

    Qt5开发及实例-CH407.rar,Qt5不规则窗体的实现方法代码

    (2)不规则窗体类ShapeWidget继承自QWidget类,为了使不规则窗体能够通过鼠标随意拖曳,在该类中重定义了鼠标事件mousePressEvent()、mouseMoveEvent()及绘制函数paintEvent(),打开“shapewidget.h”头文件

    testRoll.7z

    实现触摸屏QT滚动区手指下滑自动滚动。qt版本5.5.1。需继承带有滚动区域的原生QT类,重载mousePressEvent,mouseMoveEvent。并开启 setMouseTracking(true)。

    Qt坐标系转换(绘制逻辑坐标系)

    本资源为Qt绘图基础,世界坐标系转换为逻辑坐标系。世界坐标系原点在视图左上角,本例子通过世界坐标转换,将坐标原点定位在视图中央,Y轴向上,X轴向右,并绘制坐标轴,基于逻辑坐标系下的绘图,可将转换关系函数...

    Qt 鼠标/触屏绘制平滑曲线(支持矢量/非矢量方式)

    而鼠标或者触屏画线也不大一样,通常如果只实现鼠标画线的话,那么只需要重新实现鼠标事件即可(mousePressEvent、mouseMoveEvent、mouseReleaseEvent),而要在触控屏上画线,如果需要支持多点画线的话,就必须处理...

    QT实现画板功能-QPainter方法

    实现mouseMoveEvent鼠标移动事件当我们的鼠标发生移动的时候记录两个坐标值,一个为移动起始坐标,一个为移动后的坐标,然后调用update重新绘画我们的页面,在paintEvent绘画事件中我们使用QPainter绘画直线,因为...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    一、Qt Creator 的安装和hello world 程序的编写(原创) 1.首先到Qt 的官方网站上下载Qt Creator,这里我们下载windows 版的。 下载地址:http://qt.nokia.com/downloads 如下图我们下载:Download Qt SDK for ...

    Qt自定义表头实现过滤功能的方法

    1. 写在前面 ... 1)hover状态在鼠标移动事件中实现 void CFilterHeaderView::mouseMoveEvent(QMouseEvent *e) { m_hover = logicalIndexAt(e-&gt;pos()); if (m_hover != -1) updateSection(m_hover

    使用paintEvent绘制简单线段

    主要通过重写paintEvent、mousePressEvent、mouseMoveEvent,根据鼠标点击和移动绘制线段,并可以计算所有绘制的线段的长度。

    【VS2010 C# 代码】实时监控鼠标位置和左键点击时的位置

    Microsoft Visual Studio 2010做的C#实时监控鼠标位置和左键点击时的位置实例,主要代码: public class MouseHook { private Point point; private Point Point { get { return point; } set { if (point != value)...

    QMainWindow无标题栏和边框依然可以通过四周改变窗口大小

    QMainWindow通过setWindowFlags(Qt::FramelessWindowHint)该函数隐藏掉标题栏以后,就不能通过窗口四周来拖动大小了,所以必须要重写,重写两种方法:第一种重写是:mouseMoveEvent,该方法要设置以下两点(1)...

    【VS2010 C# 代码】获取鼠标点取窗口的位置、句柄、窗口名、窗口标题栏文字

    Microsoft Visual Studio 2010做的C#获取鼠标点取窗口的位置、句柄、窗口名、窗口标题栏文字实例,主要代码: string sShow = "请点击确定后,点击窗口的标题栏。"; MessageBox.Show(sShow); mh = new MouseHook(); ...

    按窗口标题或类名枚举窗口.e

    易语言源码,按窗口标题或类名枚举窗口.e。By:邓学彬(泪闯天涯)

    EventFilter.rar

    bool eventFilter... void mouseMoveEvent ( QMouseEvent * e ); void mousePressEvent ( QMouseEvent * e ); void mouseReleaseEvent ( QMouseEvent * e ); void mouseDoubleClickEvent( QMouseEvent * e );

    testGraphicsView角度旋转正确.rar

    通过qt图形视图绘制可拉伸矩形,圆等,并可随意旋转角度,继承qgraphicsitem if(isSelected()) { if(m_dir == Right && (event-&gt;buttons() & Qt::RightButton)){ double ang = 0; double x = m_cenPt.x()-m_...

Global site tag (gtag.js) - Google Analytics