在源应用程序窗口小部件外拖放窗口小部件

时间:2012-09-05 09:46:54

标签: qt qt4

我有一个Qt桌面应用程序,它有几个顶级小部件。可以使用拖放机制在顶级窗口小部件之间移动顶级窗口小部件的子窗口小部件。

我现在遇到的问题是将子窗口小部件放在任何现有的顶级窗口小部件之外,并创建一个新的顶级窗口小部件来包含这个窗口小部件。让我们称之为分离。

可以使用拖放来完成吗?我找不到我的dropEvent去的方法? 我是否可以在应用程序中处理drop事件,即使不允许放置位置?也许鼠标发布还是什么?

我现在无法改变一切,但也是未来的问题。对接/取消对接是更好的方法吗?

此致 米哈伊

1 个答案:

答案 0 :(得分:2)

我找到了一种方法来做到这一点。当拖动移动到应用程序窗口小部件之外时,QDrag对象会发出带有0参数的targetChanged信号。

所以我从QDrag继承,然后如果target()为null,则在析构函数中发出自定义信号。

唯一的问题是光标看起来像是drop的拦截而我无法解决这个问题,因为QDrag只能设置游标像素图以用于有效的动作,如移动或复制或链接

更新

这是继承的类。

class TabDrag: public QDrag
{
    Q_OBJECT
public:
    explicit TabDrag(QWidget *dragSource);
    ~TabDrag();

signals:
    void tearOff(); /// emit tearOff signal if the QDrag object is destroyed and target was null
};

TabDrag::TabDrag(QWidget *dragSource):QDrag(dragSource)
{
}

TabDrag::~TabDrag()
{
    // check if we need to detach this tab
    if(!target())
    {
        emit tearOff();
    }
}

tearOff信号应连接到您想要发生的任何事情。在我的情况下,我从选项卡中拉出小部件并将父级更改为新窗口。

使用示例

void MyTabBar::mouseMoveEvent(QMouseEvent* event)
{
..................
    TabDrag * drag = new TabDrag(this);
    drag->setMimeData(mimeData);
    drag->setPixmap(*m_tabPixmap.data());
    drag->setHotSpot(QPoint(m_dragStartPos.x() - tabAtRect.x(), m_dragStartPos.y() - tabAtRect.y()));
    drag->exec();

    connect(drag, SIGNAL(tearOff()), this, SLOT(onTearOff()));
}