これを行う方法を見つけました。ドラッグがアプリケーション ウィジェットの外に移動すると、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()));
}