2

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

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

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

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

问候米海

4

1 回答 1

2

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

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

唯一的问题是光标看起来像是禁止放置,我无法解决这个问题,因为 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()));
}
于 2012-09-05T16:21:20.793 回答