我试图了解在 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/