我有一个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()));
}