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對象指針再轉。