lie*_*ewl 5 c++ qt drag-and-drop mime-types
我试图了解在Qt中使用拖放时数据是如何传递的.根据我从我一直在研究的示例中理解的内容,您首先通过覆盖继承的方法将窗口小部件定义为可拖动QWidget.
在重写方法的实现中,我一直在查看的例子实例化一个指向QMimeData对象的指针,并通过调用setText(const QString &text)和存储信息setData(const QByteArray &data).它们QByteArray与<<操作员一起在对象中存储信息:
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);
Run Code Online (Sandbox Code Playgroud)
在dropEvent()接受drop的小部件中的方法定义中,这两个变量都是由>>运算符检索的:
QString text;
QPoint offset;
dataStream >> text >> offset;
Run Code Online (Sandbox Code Playgroud)
在该setData()方法中,application/x-fridgemagnet作为MIME类型参数传递.那是在其他地方定义的还是它可以弥补的东西?
如何在对象内存储和检索自定义QMimeData对象?我试过这个:
dataStream << labelText << QPoint(ev->pos() - rect().topLeft()) << myObject;
Run Code Online (Sandbox Code Playgroud)
并试图像这样检索它:
myClass myObject;
dataStream >> text >> offset >> myObject;
Run Code Online (Sandbox Code Playgroud)
但它没有用,说"无法匹配'运营商>>".我应该怎么做的提示?
在setData()方法中,application/x-fridgemagnet作为MIME类型参数传递.那是在其他地方定义的还是它可以弥补的东西?
如果数据采用您自己的专有格式,那么您可以进行补偿.但是,如果它是标准化的东西,比如图像,那么你可能想要使用已知的mime类型.
如果您已经支持序列化为XML,那么创建自己的mime类型,序列化为XML,然后在接收端反序列化将很容易.
如何在QMimeData对象中存储和检索自定义对象?
您需要创建MyObject以QDataStream支持的方式写出成员数据的非成员运算符(<<和>>).请参阅"阅读和编写其他Qt类"标题下的QDataStream 文档.
这将涉及创建以下两种方法:
QDataStream &operator<<(QDataStream &, const MyObject &);
QDataStream &operator>>(QDataStream &, MyObject &);
Run Code Online (Sandbox Code Playgroud)
由于这些是非成员运算符,因此它们将在您的类外定义:
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>> */
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8658 次 |
| 最近记录: |