Qt判断鼠标是否在控件上
if (widget->geometry().contains(point))
{
}
void Widget::mouseMoveEvent(QMouseEvent* event)
{
QPoint p = event->pos();
if (ui->label->geometry().contains(p)) {
qDebug() << "enter";
}
}
Qt判断鼠标是否在某子窗口控件
需要注意的是,子窗口获取geometry,是相对于父窗口的相对位置,QCursor::pos()获取的是鼠标绝对位置,要不将父窗口的相对位置进行换算,要不将鼠标的绝对位置进行换算,这里采用将鼠标绝对位置换算到控件上,示例代码如下:
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对象。在构造函数里初始化
menu = new QMenu("menu", this); //menu在头文件声明
QAction *action = new QAction(tr("1111"), this); //为使目录较大,能看见,我们添加一个action
menu->addAction(action);
然后在mousePressEvent里看到效果
void Dialog::mousePressEvent(QMouseEvent *e)
{
if(e->button() == Qt::RightButton) //鼠标右键。避免无法关掉窗口
{
QPoint p(0, 0);
//menu->exec(p); //测试用,坐标相对于桌面
menu->exec(e->globalPos()); //坐标相对于窗口
//menu->exec(e->pos()); //坐标相对于桌面
}
}
可以看到,pos不管窗口怎样移动,menu总是出现在相同的地方。globalPos相对于窗口,跟着窗口移动.<br /> pos不管窗口怎样移动,menu总是出现在相同的地方。<br /> globalPos相对于窗口,跟着窗口移动。不论我点哪菜单就在哪show,所以是相对桌面的,要不叫global呢~~ globalPos(),给出的坐标信息是相对于桌面的,即以桌面左上角为原点。
pos(),是相对于窗口的,以窗口左上角为原点(去除边框)。即pos()给出的是一个相对位置坐标。而globalPos(),给出的是一个绝对坐标。