【问题标题】:Drag and drop widget outside source application widgets将小部件拖放到源应用程序小部件之外
【发布时间】:2012-08-30 00:11:12
【问题描述】:

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

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

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

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

问候 米海

【问题讨论】:

    标签: qt qt4


    【解决方案1】:

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

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

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

    【讨论】:

    • 为 Qt5 研究相同的问题并找到这个聪明的答案。但是你将 targetChanged 信号连接到什么?哪个小部件收到此通知?您是否将其连接回自定义 Drag 对象本身?还是创建 Drag 并调用其 exec 的源小部件?另外,在 targetChanged 的​​插槽中,您当时不能调用 dragobj.setDragCursor(custom cursor pixmap) 吗?谢谢。哦哦,还有! Drag::exec() 的 Qt5 文档说“在 Windows 上,Qt 事件循环在操作期间被阻塞。”所以没有信号?
    • 首先使用 exec 绝不是一个好主意,因为您创建的子事件循环可能会产生事件反转,这可能会导致您崩溃。 Qt 在子事件循环方面不太好。不要使用它们。由于一些模式弹出窗口,我从经历过的崩溃中说出来
    • 是的,你是对的。我也使用 exec()。我不记得了。嗯...那我应该研究我自己的建议:)。如果事件循环被阻塞,那么拖动时可能无法更新窗口。
    • 希望 Qt5 带来更好的选择,但我没有这种奢侈
    • 如果您找到任何适用于 Qt5 的内容,请告诉我。我也有兴趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多