如何实现2个应用程序之间的拖放?

时间:2019-05-18 13:56:29

标签: c++ qt

我正在尝试创建一个应用程序,该应用程序将通过QLocalServer / QLocalSocket进行通信。我计划使用拖放机制实现服务器名称传递机制。 该机制如下:

  • 在一个应用程序中创建QLocalServer,在另一个应用程序中创建QLocalSocket
  • 服务器开始监听某个地址,
  • 将某些指定的小部件从第一个应用程序拖放到另一个应用程序时,它必须通过QMimeData传递地址,
  • 第二个应用获取服务器地址并连接到它。

我已经实现了一些代码,但是看来,应用程序之间的拖放在mimeData对象中进行了一些更改。这是代码片段以及我得到的结果:

mouseMoveEvent(QMouseEvent* event)
{
    if (!__drag_options.__drag_started)
        return;

    if (distance(__drag_options.__drag_started_position, event->pos()) < DRAG_DISTANCE)
        return;

    QDrag drag(this);
    QMimeData* mimeData = new QMimeData;
    mimeData->setData("type", "pin");
    mimeData->setData("address", __address);
    drag.setMimeData(mimeData);
    drag.exec(Qt::MoveAction);
}

dropEvent(QDropEvent* event)
{
    qDebug() << "dropEvent " << event->mimeData()->formats();
    const QMimeData* mime = event->mimeData();
    QString serverName = mime->data("pin_name");
    __socket->connectToServer(serverName);
}

结果是

  

dragEnterEvent(“ application / x-qt-windows-mime; value = \” type \“”,“ application / x-qt-windows-mime; value = \” address \“”)

如您所见,没有一个名为“地址”的哑剧。

关于如何达到目标的任何建议?

1 个答案:

答案 0 :(得分:1)

我建议您使用标准的哑剧类型,例如jsonapplication/json(并发送以JSON编码的数据),XML或...

如果您使用自定义的mime类型,则必须忍受Qt更改该mime类型的事实,使其更加符合标准。

只要您停留在一个应用程序中,您的mime类型就不会被触及。

从一个应用程序拖到另一个应用程序后,就需要平台的剪贴板等。 (如果我没记错的话,Windows仅支持某些可能的mime类型。)