如何通过拖放获取鼠标下QLayout中的小部件?

Posted

技术标签:

【中文标题】如何通过拖放获取鼠标下QLayout中的小部件?【英文标题】:How to get the widget in QLayout under the mouse by Drag&drop? 【发布时间】:2020-08-03 03:03:05 【问题描述】:

我构建了一个接受拖放的小部件,如下所示:

MyWidget::MyWidget( QWidget *p_parent ) : QFrame( p_parent )

    setAcceptDrops( true );
    m_layout = new QLayout( this );  //this is layout of my custom widget
    layout->setSpacing( 0 );

    m_indicator = new QWidget( this );
    m_indicator->setObjectName( "indicator" );
    m_indicator->setFixedWidth( 5 );
    layout->addWidget( m_indicator );
    ....
    ....
 

 void MyWidget::dragMoveEvent( QDragMoveEvent *p_event )
 
    p_event->acceptProposedAction();
 

我的主要工作是将拖动的对象插入到布局中,因此,我应该确定鼠标下方的项目,然后再做我的工作。在上面的函数dragMoveEvent 中,我可以通过p_event->pos() 来获取鼠标的位置。但是QLayout 没有方法itemAt(int x, int y)。我现在该怎么办?

【问题讨论】:

@hyde:谢谢,我只是太专注于布局,忘记了父窗口小部件:) 【参考方案1】:

布局无法做到这一点,但幸运的是the parent widget can。示例代码(未经测试):

void MyWidget::dragMoveEvent( QDragMoveEvent *p_event )
 
    auto *widget = childAt(p_event->pos());
    if(widget) 
        ....
 

【讨论】:

以上是关于如何通过拖放获取鼠标下QLayout中的小部件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QLayout 中查找给定类型的小部件?

用户在不使用 QLayout 的情况下扩展/调整 QTextBrowser 小部件的大小

如何通过鼠标拖放来更改布局中小部件的顺序?

通过拖放项目制作类似列表的小部件的最简单方法是啥?

qwidget如何拖放由几个小部件组成?

如何在从另一个小部件拖放事件期间突出显示表格单元格