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



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

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

这可以通过拖放来完成吗?我找不到我的dropEvent的去向?即使不允许放置位置,我也可以处理应用程序中的放置事件吗?也许是释放鼠标什么的?

我不能改变现在的一切,但也不能改变未来的问题。对接/解除对接是更好的方法吗?

问候Mihai

我找到了一种方法。当拖动移动到应用程序小部件之外时,QDrag对象会发出一个参数为0的targetChanged信号。

因此,我继承了QDrag,然后如果target()为null,则在析构函数中发出一个自定义信号。

唯一的问题是,光标看起来像是阻止拖放,我无法解决这个问题,因为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()));
}

最新更新