关于QT的mouseMoveEvent的问题

xiaoxin_ye 2009-07-01 09:31:57
事情是这样的,我要实现以下效果。
在我的窗体上有几个按钮,我要实现当我鼠标移动到某一个按钮上的时候,回弹出一段文字提示,鼠标移开的时候文字框自动关闭。
自然我想到了用在窗体类中重载mouseMoveEvent方法,通过实时监控鼠标坐标和按钮坐标比较,然后做出判断。
代码如下:

void MainForm::mouseMoveEvent(QMouseEvent *event)
{
QPoint mouseCursor = event->pos();
QRect connectButtonRect = ui.connectButton->rect();

if(connectButtonRect.contains(mouseCursor) == true)
{
//弹出文字提示框
}

}

编译OK,但运行的时候发现该函数体从来没有被调用执行过,通过查看资料发现在窗体初始化的时候少了一句setMouseTracking(true);

但我即便加上这句话貌似还是有问题,只有当鼠标左击或者右击按钮按下的时候才会调用该函数,否则光移动鼠标的话还是不能调用。
甚至开始怀疑我的Qt出了问题,请各位大侠指教。。

还有如果要实现我开始所说的效果一定要通过这种方法做到么,有其他比较简单的方法么,跪谢。。。。
...全文
2561 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
码记 2012-05-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

搞了半天,才搞明白,很感谢在网上分享资料,与喜悦的人。现在我也分享一下,我的成果
1.在构建的时候添加this->setMouseTraking();
2.重载
void objectname::mouseMoveEvent(QMouseEvent *event)
{
QRect rect =ui->havemouseEnter->frameGeometry();
Q……
[/Quote]我还是没看懂楼主什么意思?
老虎须 2010-12-09
  • 打赏
  • 举报
回复
搞了半天,才搞明白,很感谢在网上分享资料,与喜悦的人。现在我也分享一下,我的成果
1.在构建的时候添加this->setMouseTraking();
2.重载
void objectname::mouseMoveEvent(QMouseEvent *event)
{
QRect rect =ui->havemouseEnter->frameGeometry();
QPoint point = event->pos();
QSize size = rect.size()-QSize(-2,-2);
QRect dstRect =QRect(QPoint(rect.x()-1,rect.y()-1),size);
if(dstRect.contains(point))
{
ui->havemouseEnter->click();
}
}
yang1988han 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaoxin_ye 的回复:]

引用 4 楼 hairetz 的回复:
QMouseEvent 貌似是按下鼠标并且移动才有用的吧。
Mouse move events will occur only when a mouse button is pressed down, unless mouse tracking has been enabled with QWidget::setMouseTracking().
……
[/Quote]

很简单,在构建函数的时候就用上这句话就行了。
YZProut 2009-12-12
  • 打赏
  • 举报
回复
rect.contains(point) 这句去掉就可以了。为什么呢
mississipii 2009-07-03
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
QMouseEvent 貌似是按下鼠标并且移动才有用的吧。
Mouse move events will occur only when a mouse button is pressed down, unless mouse tracking has been enabled with QWidget::setMouseTracking().


而具体的空间都有MouseEnter类似的事件的,你可以用这些事件来处理

void QWidget::enterEvent ( QEvent * ) [虚 保护]
这个事件处理器可以在子类中被重新实现用来接收窗口部件进入事件。
当鼠标光标进入窗口部件,这个事件被发送给窗口部件。


也可以参考leaveEvent()、mouseMoveEvent()和event()。
  • 打赏
  • 举报
回复
但我即便加上这句话貌似还是有问题,只有当鼠标左击或者右击按钮按下的时候才会调用该函数,否则光移动鼠标的话还是不能调用。


如果是这个症状就没有问题啊。本来就是这个效果啊。

你用void QWidget::enterEvent ( QEvent * )啊
xiaoxin_ye 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 rzsheng 的回复:]
void QWidget::contextMenuEvent ( QContextMenuEvent * event )
[/Quote]

我qt的版本是4.3.2
有上述的方法试了,还是没有效果啊,既然很多人都遇到跟我一样的情况,就难道就没有解决措施么。。。

继续等待高手来解决。。。
xiaoxin_ye 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hairetz 的回复:]
QMouseEvent 貌似是按下鼠标并且移动才有用的吧。
Mouse move events will occur only when a mouse button is pressed down, unless mouse tracking has been enabled with QWidget::setMouseTracking().

而具体的空间都有MouseEnter类似的事件的,你可以用这些事件来处理

void QWidget::enterEvent ( QEvent * ) [虚 保护]
这个事件处理器可以在子类中被重新实现用来接收窗口部件进入事件。
当鼠标光标进入窗口…
[/Quote]

我调用setMouseTracking()了,貌似还是不行。说白了,就是这个程序的实际运行结果跟Qt的reference明显不符合,不知道是reference有不正确还是我的qt有问题。。。
mississipii 2009-07-02
  • 打赏
  • 举报
回复
你没有对按钮位置进行过滤,对窗口部件过滤就OK了,函数我忘记叫什么了,事件过滤的那个函数
jawiudi 2009-07-02
  • 打赏
  • 举报
回复
如果只是想出现文字提示,试试以下方法:
在ui中,右击按钮,选“Change Tooltip”,然后添加你想要显示的文字。
ryanzz 2009-07-02
  • 打赏
  • 举报
回复
进来学习一下
yhf365 2009-07-02
  • 打赏
  • 举报
回复
mouseMoveEvent我刚试了一下,不知道如何实时监控,必须按下并拖动才触发。
而contextMenuEvent也不知如何实现。
Context menu events are sent to widgets when a user performs an action associated with opening a context menu. The actions required to open context menus vary between platforms; for example, on Windows, pressing the menu button or clicking the right mouse button will cause this event to be sent.
从它的说明可以看出,contextMenuEvent与打开菜单相关联,
在windows中,点击右键才会触发。
rzsheng 2009-07-01
  • 打赏
  • 举报
回复
void QWidget::contextMenuEvent ( QContextMenuEvent * event )
rzsheng 2009-07-01
  • 打赏
  • 举报
回复
你的 QT 版本是多少,如果是高版本的,
你可以使用

contextMenuEvent

这个可以捕捉鼠标移动消息,而不需要按住鼠标按键。
rzsheng 2009-07-01
  • 打赏
  • 举报
回复
我这里的情况跟你的一样。

23,127

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧