2

いくつかのトップレベルのウィジェットを持つ Qt デスクトップ アプリケーションがあります。トップレベル ウィジェットのサブウィジェットは、ドラッグ アンド ドロップ メカニズムを使用してトップレベル ウィジェット間で移動できます。

私が今抱えている問題は、既存のトップレベルのウィジェットの外側にサブウィジェットをドロップし、これを含む新しいトップレベルのウィジェットを作成することです。これを分離と呼びましょう。

これはドラッグ アンド ドロップを使用して実行できますか? dropEvent の行き先が見つからないのですが? ドロップ場所が許可されていない場合でも、アプリケーションでドロップ イベントを処理することはできますか? 多分マウスリリースか何か?

今すべてを変えることはできませんが、将来への質問でもあります。ドッキング/ドッキング解除はこれを行うためのより良い方法ですか?

よろしくミハイ

4

1 に答える 1

2

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