Перетаскивание в QTreeWidget с пользовательским классом (ошибка: Qvariant::сохранить)

#qt #c 11 #qtreewidget #qvariant

#qt #c 11 #qtreewidget #qvariant

Вопрос:

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

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

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

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

friend QDataStream amp; operator << (QDataStream amp;arch, const MyClass amp; object)

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

qRegisterMetaTypeStreamOperators<MyClass>("MyClass")

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

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

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

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

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


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

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

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

Ответ №1:

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

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

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