Раздавание данных с QMimeData в спокойном перетаскивании

Я пытаюсь понять, как данные розданы при использовании перетаскивания в 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;

Но это не работало, говорит, что нет "никакого соответствия для 'оператора>>'". Какие-либо подсказки относительно того, что я должен сделать?

5
задан Marc Mutz - mmutz 20 June 2012 в 22:30
поделиться

2 ответа

В методе 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>> */
6
ответ дан 14 December 2019 в 01:06
поделиться

Да, вы можете создать свой собственный тип MIME для использования в вашем собственном приложении. Очевидно, что никакие внешние приложения не будут знать, что это такое, поэтому вы не сможете перетащить их за пределы своего собственного приложения.

Что касается хранения вашего собственного объекта, вам необходимо определить оператор потока, поскольку Qt ничего не знает о вашем объекте. QDataStream определяет только операторы потока для простых встроенных типов. Вам нужно будет определить что-то вроде

QDataStream& operator<<( QDataStream& ds, const myClass& myObject )
{
    // Use existing QDataStream stream operators or other methods to serialise your object
    // ...
    // ...

    return ds;
}

. Аналогично для десериализации вам нужно будет определить соответствующий оператор >> .

3
ответ дан 14 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: