Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <QObject>
- #include <QPointer>
- template <typename T, typename = void>
- struct is_deserializeable : std::false_type {};
- template <typename T>
- struct is_deserializeable <T, decltype(std::declval<QDataStream&>() >> std::declval<T&>())> : std::true_type {};
- template <typename T, typename = std::enable_if_t<is_deserializeable<T>::value>>
- class Property
- {
- public:
- Property(FruitWrapper* obj)
- : m_obj{obj} { }
- void setValue(const QByteArray& array) noexcept
- {
- if (array.isEmpty()) { return; }
- T value;
- QDataStream dataStream{array};
- dataStream >> value;
- if (value != m_value) {
- m_value = std::move(value);
- emit m_obj->valueChanged();
- }
- }
- T getValue() const noexcept { return m_value; }
- private:
- T m_value = T();
- QPointer<FruitWrapper> m_obj;
- };
- class FruitWrapper: public QObject
- {
- Q_OBJECT
- Q_ENUMS(FruitType)
- Q_PROPERTY(FruitType value READ getValue NOTIFY valueChanged)
- public:
- enum class Fruit: qint32 {
- APPLE = 0x0000,
- PEACH = 0x0001,
- BANANA = 0x0002
- };
- Data(QObject *parent = nullptr);
- void setValue(const QByteArray &array) override;
- Turn getValue() const;
- private:
- friend QDataStream& operator<<(QDataStream& out, const FruitWrapper::Fruit& fruit);
- friend QDataStream& operator>>(QDataStream& in, FruitWrapper::Fruit& fruit);
- _detail::Property<Enum> m_impl;
- };
- QDataStream& operator<<(QDataStream& out, const FruitWrapper::Fruit& fruit)
- {
- out << static_cast<qint32>(fruit);
- return out;
- }
- QDataStream& operator>>(QDataStream& in, FruitWrapper::Fruit& fruit)
- {
- qint32 v;
- in >> v;
- fruit = static_cast<FruitWrapper::Fruit>(v);
- return in;
- }
Advertisement
Add Comment
Please, Sign In to add comment