Qt判断鼠标是否在控件上

    1. if (widget->geometry().contains(point))
    2. {
    3. }
    4. void Widget::mouseMoveEvent(QMouseEvent* event)
    5. {
    6. QPoint p = event->pos();
    7. if (ui->label->geometry().contains(p)) {
    8. qDebug() << "enter";
    9. }
    10. }

    Qt判断鼠标是否在某子窗口控件
    需要注意的是,子窗口获取geometry,是相对于父窗口的相对位置,QCursor::pos()获取的是鼠标绝对位置,要不将父窗口的相对位置进行换算,要不将鼠标的绝对位置进行换算,这里采用将鼠标绝对位置换算到控件上,示例代码如下:

    1. if(ui->groupBox->geometry().contains(this->mapFromGlobal(QCursor::pos())))

    QT中的相对位置,绝对位置之间的转换(maptoglobal,mapfromglobal)
    相对位置:每个Qwidget都能通过pos()获取到相对自己父类窗口的位置,

    绝对位置:pWidget->mapToGlobal(QPoint(0,0)) ;将当前控件的相对位置转换为屏幕绝对位置
    绝对位置转为相对位置: pWidget->mapFromGlobal(QPoint(0,0)), 将绝对位置对应到控件的相对位置。

    Qt的pos()和globalpos()
    新建一个窗口程序,然后创建一个QMenu对象。在构造函数里初始化

    1. menu = new QMenu("menu", this); //menu在头文件声明
    2. QAction *action = new QAction(tr("1111"), this); //为使目录较大,能看见,我们添加一个action
    3. menu->addAction(action);

    然后在mousePressEvent里看到效果

    1. void Dialog::mousePressEvent(QMouseEvent *e)
    2. {
    3. if(e->button() == Qt::RightButton) //鼠标右键。避免无法关掉窗口
    4. {
    5. QPoint p(0, 0);
    6. //menu->exec(p); //测试用,坐标相对于桌面
    7. menu->exec(e->globalPos()); //坐标相对于窗口
    8. //menu->exec(e->pos()); //坐标相对于桌面
    9. }
    10. }
    1. 可以看到,pos不管窗口怎样移动,menu总是出现在相同的地方。globalPos相对于窗口,跟着窗口移动.<br /> pos不管窗口怎样移动,menu总是出现在相同的地方。<br /> globalPos相对于窗口,跟着窗口移动。不论我点哪菜单就在哪show,所以是相对桌面的,要不叫global呢~~ globalPos(),给出的坐标信息是相对于桌面的,即以桌面左上角为原点。
    2. pos(),是相对于窗口的,以窗口左上角为原点(去除边框)。即pos()给出的是一个相对位置坐标。而globalPos(),给出的是一个绝对坐标。