Я пытаюсь понять, как данные розданы при использовании перетаскивания в QT Из того, что я понял от примеров, которые я изучал, Вы сначала определяете виджет как перемещаемый методами переопределения, наследованными через QWidget
.
В реализации переопределенного метода примеры, на которые я смотрел, инстанцируют указателя на a 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);
В определении dropEvent()
метод в виджете, который принимает отбрасывания, обе из тех переменных, был получен с >>
оператор:
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;
Но это не работало, говорит, что нет "никакого соответствия для 'оператора>>'". Какие-либо подсказки относительно того, что я должен сделать?
В методе setData () application / x-холодильникmagnet было передано как аргумент типа MIME. Было ли это определено где-то еще или это просто что-то, что вы можете придумать?
Если данные находятся в вашем собственном частном формате, вы можете это придумать. Однако если это что-то стандартизованное, например изображения, вы, вероятно, захотите использовать известный тип mime.
Если вы уже поддерживаете сериализацию в XML, то было бы легко создать свой собственный mime-тип, сериализовать в XML, а затем десериализовать на принимающей стороне.
Как я могу сохранить и получить пользовательский объект внутри объекта QMimeData?
Вам нужно будет создать операторы, не являющиеся членами (<< и >>), которые записывают член MyObject
данные способом, поддерживаемым QDataStream. См. Документацию QDataStream под заголовком «Чтение и запись другого класса 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>> */
Да, вы можете создать свой собственный тип MIME для использования в вашем собственном приложении. Очевидно, что никакие внешние приложения не будут знать, что это такое, поэтому вы не сможете перетащить их за пределы своего собственного приложения.
Что касается хранения вашего собственного объекта, вам необходимо определить оператор потока, поскольку Qt ничего не знает о вашем объекте. QDataStream
определяет только операторы потока для простых встроенных типов. Вам нужно будет определить что-то вроде
QDataStream& operator<<( QDataStream& ds, const myClass& myObject )
{
// Use existing QDataStream stream operators or other methods to serialise your object
// ...
// ...
return ds;
}
. Аналогично для десериализации вам нужно будет определить соответствующий оператор >>
.