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

Posted

技术标签:

【中文标题】qwidget如何拖放由几个小部件组成?【英文标题】:How drag and drop qwidget consisting of several widgets? 【发布时间】:2018-06-26 00:23:56 【问题描述】:

我有几个 QWidget,比如说 previewWidget,每个都包含 2 个 QLabel(可能比 QLabel 更多)。我想在主窗口中拖放 previewWidget

问题:我可以通过在绿色区域(PreviewWidget 区域)上按下鼠标来移动小部件。但是,如果我尝试通过单击其中一个标签来拖动小部件,则该标签会移出 previewWidget(有时我什至不明白会发生什么)。我想要的是移动整个 previewWidget 或者当鼠标按下它的孩子时至少没有发生任何事情。

我的方法。我重载了 mousePressEvent() 如下:

void MainWindow::mousePressEvent(QMouseEvent *event)

   // I beleive my problem is right here...
    PreviewWidget *child = static_cast<PreviewWidget*>(this->childAt(event->pos()));

    if (!child)
        return;    // this is not returned even if the child is not of a PreviewWidget type

    // Create QDrag object ...

如何以我想要的方式拖放 PreviewWidget?任何例子都值得赞赏。

【问题讨论】:

您尝试Qt::WA_TransparentForMouseEvents 获取标签了吗? 我重载了标签的 mousePressEvent() 方法并将它们留空。现在,当我拖动标签时它什么也不做,到目前为止就足够了。关于您的建议,我不希望它们对鼠标事件完全透明。 【参考方案1】:

我建议在光标坐标处识别孩子的策略。

在你的mousePressEvent:

//...

QWidget * child = childAt(e->pos());
if(child != 0)

    QString classname(child->metaObject()->className());
    if( classname == "QLabel")
    
        child = child->parentWidget();
        if(child != 0)
        
            classname = child->metaObject()->className();
        
    
    if(classname == "PreviewWidget")
    
        //do whatever with child ...
    

【讨论】:

以上是关于qwidget如何拖放由几个小部件组成?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Pyqt QMdiSubWindow 使用可变数量的小部件调整大小

如何拖放自定义小部件?

在pyqt5中的QWidget上实现dragMoveEvent?

如何将小部件放入空的 QWidget 中? [关闭]