关于QWidget::childAt

childAt返回的是显示在当前QWidget的参数位置的最顶层的子widget。比如我有下面这样的ui

然后重载右键菜单事件

void ChildAtCheck::contextMenuEvent(QContextMenuEvent * ev)
{
 QWidget* pItem = childAt(ev->pos());
 if(!pItem) return;
 
 qDebug()<<pItem->objectName()<<"   " << pItem->parent()->objectName();
}

在执行过程中,我在不同位置单击右键得到了不同的结果:

"label"     "centralWidget"
"widget_2"     "centralWidget"
"widget"     "widget_2"
"pushButton_3"     "widget_2"
"pushButton"     "widget"
"pushButton_2"     "widget"

可见childat拿到的是参数对应位置的最顶层widget指针(也就是可见的widget),和qt助手里面的解释相符

QWidget * QWidget::childAt(const QPoint & p) const

This is an overloaded function.

Returns the visible child widget at point p in the widget's own coordinate system

所以如果自己写的MyWidget类作为子widget插入到界面中时,不能childAt获取到指针后直接转成MyWidget,而是通过控件层级关系拿到MyWidget对象指针再转。

 

posted @ 2017-03-25 13:38  Mr.Ira  Views(3064)  Comments(0Edit  收藏  举报