关于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对象指针再转。