c++ - 在 Qt 拖放中使用 QMimeData 传递数据

标签 c++ qt drag-and-drop mime-types

我试图了解在 Qt 中使用拖放时数据是如何传递的。根据我从我一直在研究的示例中了解到的情况,您首先通过覆盖通过 QWidget 继承的方法将小部件定义为可拖动的。 .

在重写方法的实现中,我一直在查看的示例实例化了一个指向 QMimeData 的指针。对象,并通过调用 setText(const QString &text) 在其中存储信息和 setData(const QByteArray &data) .他们将信息存储在 QByteArray 中带有 << 的对象运算符(operator):

QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);

dataStream << labelText << QPoint(ev->pos() - rect().topLeft());

QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-fridgemagnet", itemData);
mimeData->setText(labelText);

dropEvent()的定义中接受掉落的小部件中的方法,这两个变量都是使用 >> 检索的运算符(operator):

QString text;
QPoint offset;
dataStream >> text >> offset;

setData()方法,application/x-fridgemagnet 作为 MIME 类型参数传递。这是在其他地方定义的,还是您可以编造的?

如何在 QMimeData 中存储和检索自定义对象目的?我试过这个:

dataStream << labelText << QPoint(ev->pos() - rect().topLeft()) << myObject;

并尝试像这样检索它:

myClass myObject;
dataStream >> text >> offset >> myObject;

但是它没有用,说“'operator >>' 不匹配”。关于我应该做什么的任何提示?

最佳答案

In the setData() method, application/x-fridgemagnet was passed as a MIME type argument. Was that defined somewhere else or its just something you can make up?

如果数据是你自己专有的格式,那你可以自己编。但是,如果它是标准化的东西,例如图像,您可能希望使用已知的 MIME 类型。

如果您已经支持序列化为 XML,那么创建您自己的 mime 类型、序列化为 XML,然后在接收端反序列化就很容易了。

How can I store and retrieve a custom object inside the QMimeData object?

您需要创建非成员运算符(<< 和 >>),以 QDataStream 支持的方式写出 MyObject 的成员数据。查看 QDataStream documentation在“读写其他 Qt 类”标题下。

这将涉及创建以下两个方法:

QDataStream &operator<<(QDataStream &, const MyObject &);
QDataStream &operator>>(QDataStream &, MyObject &);

由于这些是非成员运算符,它们将在您的类之外定义:

class MyObject { /* ... */ };

QDataStream &operator<<(QDataStream &stream, const MyObject &obj) {
    /* as long as first_member and second_member are types supported
       by QDataStream, I can serialize them directly.  If they're not
       supported, I'd need an operator for them as well unless I can
       convert them to a QString or something else supported by Qt /
       QDataStream */
    stream << obj.first_member;
    stream << obj.second_member;
    /* and so on and so forth */
    return stream;
}
/* and similarly for operator>> */

关于c++ - 在 Qt 拖放中使用 QMimeData 传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2314078/

相关文章:

c++ - 检查数组中的重复数字

c++ - QListWidget 通过 setItemWidget 拖放自定义小部件集

c++ - Frameles 和透明窗口不起作用! Qt 部件

Qt 4.8.4 针对嵌入式 Linux 的交叉编译失败并出现 QNetworkProxy 错误

c# - 使用 SendMessage 拖放

c++ - 链接列表示例 - 为什么使用它们?

c++ - ifstream::eof 在 if 语句中抛出类型错误

c++ - "overloaded function differs only by return type"错误

jquery - 将 div 的副本拖放到另一个 div 中

qt+pyqt 发出两次丢弃的 URL