Перетащите в QTreeWidget с помощью пользовательского класса (Ошибка: Qvariant :: save) - PullRequest
0 голосов
/ 03 апреля 2019

Моя проблема заключается в следующем: я хочу использовать перетаскивание в моем QTreeWidget.Мой QtreeWidgetItem имеет следующие флаги Enabled | selectable |Drag | Drop.

Он работает для элемента, но не для остальных (Ошибка Qvariant :: Сохранить недопустимый тип для сохранения)

Это потому, что мы делаем некоторые : setdata(QVariant::fromvalue<...

Я понимаю, так как я хочу использовать пользовательские данные, мне нужно, чтобы QVariant понимал мой класс, и для этого мне нужно, чтобы у моего класса был конструктор по умолчанию, конструктор копирования, деструктор и оператор 2overlord << и >>.

friend QDataStream & operator << (QDataStream &arch, const MyClass & object)

После того, как мне нужно Q_DECLARE_METATYPE(MyClass) и зарегистрируйте моего оператора с помощью:

qRegisterMetaTypeStreamOperators<MyClass>("MyClass")

НоЯ не могу заставить это работать.(все еще ошибка Qvariant :: Сохранить недопустимый тип для сохранения)

Мне нужна помощь, чтобы понять, куда все идет.Мои операторы перегрузок определены в моем классе (.H)

Должен ли мой Q_DECLARE_METATYPE быть объявлен в конце моего класса?(.h) будет ли проблема, потому что класс SOMME наследуется от него?или потому что он имеет чистую функцию?

Я знаю, что многие люди используют qRegisterMetaTypeStreamOperators в основном, но я не могу этого сделать, могу ли я использовать его где-то еще (в конструкторе одного моего класса или это вызовет проблему (как многократное объявление или многократный вызов как функция соединения))

Ошибка никогда не изменится, это нормально, или должен ли Qt сказать мне: «он распознает класс, который я хочу сохранить, но ему не нужно все»?


Хорошо, я ответил на некоторые мои вопросы: Q_DECLARE_METATYPE не обязательно должен быть в .H (сейчас работайте с моим .cpp). Вы можете использовать ваши qRegisterMetaTypeStreamOperators в конструкторе (как соединение)Когда QT пересмотрит ваш класс, он покажет другое сообщение (сейчас моя проблема в том, что мой класс - абстрактный класс)

Я пытаюсь заставить его работать с моей текущей архитектурой

MyClass (Abstract)
  - MyClassTemplate : MyClass
      -MyClassA : MyClassTemplate<MyClassA>
      -MyClassB : MyClassTemplate<MyClassB>

1 Ответ

0 голосов
/ 04 апреля 2019

Хорошо, я понял. Вы можете использовать легкий трюк. создайте структуру, которая имеет указатель на класс, который вы хотите передать, и имела операторы << и >> в этом классе. Q_Dclare_Metatype (ваша структура) не забудьте qRegisterMetaTypeStreamOperators вашей структуры

Поскольку ваш элемент класса никогда не уничтожается, вы можете просто передать указатель на него без какого-либо риска, и поскольку вы объявили, какой тип вы передадите, qt примет его (потому что, когда я просто использовал void * или другой тип указателя, qt уточнил, что он имеет определенный тип и не будет работать.

Надеюсь, это поможет вам, если у вас возникнет такая же проблема

...