пятница, 17 июня 2011 г.

Добавление своего типа в QVariant

Хороший тип QVariant. Это может быть int, double, QDate, QMap, и еще полсотни типов.
Добавим к этим типам собственный класс или структуру, чтобы с ней можно было бы общаться как с другими типами - помещать и извлекать из QVariant.

class SomeClass
{
//всё что нужно
};
Q_DECLARE_METATYPE(SomeClass)


Итак, достаточно после определения класса вызвать макрос Q_DECLARE_METATYPE()
Что это дает?


Помещаем экземпляр класса в QVariant.

SomeClass scl;
QVariant vclass = QVariant::fromValue(scl);


Всё, теперь экземпляр класса SomeClass, хранится как QVariant и с ним можно делать всё, что и с объектами типа QVariant.

Обратное преобразование.

scl = qvariant_cast(vclass);

Вообще говоря, в классе SomeClass крайне желательно определить оператор присваивания и конструктор копирования, на случай если вдруг возникнет желание помещать его в контейнер типа QList. Если это обычная структура, то ничего страшного, конечно, не произойдет, элементы структуры скопируются компилятором.

Теперь об одной особенности макроса Q_DECLARE_METATYPE(). Он не приемлет запятых в определении.
Написать что-то типа
Q_DECLARE_METATYPE(QVector<QPair<QString, QString> >)
не получится, из-за запятой в определении шаблона.
Лечится это хитрым патчем.

#define Q_DECLARE_METATYPE_COMMA(...) \
QT_BEGIN_NAMESPACE \
template <> \
struct QMetaTypeId< __VA_ARGS__ > \
{ \
    enum { Defined = 1 }; \
  static int qt_metatype_id() \
  { \
     static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
     if (!metatype_id) \
        metatype_id = qRegisterMetaType< __VA_ARGS__ >( #__VA_ARGS__, \
          reinterpret_cast< __VA_ARGS__ *>(quintptr(0))); \
     return metatype_id; \
  } \
}; \
QT_END_NAMESPACE \

Я даже не буду рассказывать, что здесь делается т.к. сам не понимаю и хитрый патч вытащен откуда-то из просторов интернета.
Главное, что с его помощью мы можем написать
Q_DECLARE_METATYPE_COMMA(QVector<QPair<QString, QString> >)

* This source code was highlighted with Source Code Highlighter.
 И тогда мы сможем назначить typedef
typedef QVector<QPair<QString, QString> > VectorPair;
Q_DECLARE_METATYPE_COMMA(VectorPair)


* This source code was highlighted with Source Code Highlighter.
и использовать тип VectorPair как QVariant.

6 комментариев:

  1. парсер съел SomeClass в
    scl = qvariant_cast< SomeClass >(vclass);

    и если же объявлено
    typedef QVector< QPair< QString, QString > > VectorPair;
    то можно писать Q_DECLARE_METATYPE(VectorPair) не прибегая к Q_DECLARE_METATYPE_COMMA

    ОтветитьУдалить
  2. Извините, что влез немного не по теме, но...

    Вы не знаете как сконвертировать файлы проекта QtCreator (.pro) в файлы проекта studio 2010 (.vcxproj)?

    ОтветитьУдалить
  3. http://doc.qt.io/vs-addin/

    ОтветитьУдалить
  4. VarangaOfficial - варанга цена - все, что бы хотели знать об этом препарате. Воспользовавшись данным интернет-порталом, вы получите возможность узнать подробную информацию касательно этого натурального лекарственного комплекса. Увидеть данные о клиническом тестировании геля, прочитать реальные отзывы пациентов и врачей. Изучить инструкцию по применению, прочесть об особенностях и методах работы мази, уяснить, в чем заключаются особенности работы крема Варанга, где можно купить оригинальный сертифицированный препарат и, как избежать покупки подделки. Мы очень тщательно и скурпулезно проверяем размещаемые на сайте данные. Предоставляем посетителям нашего онлайн-ресурса сведения, которые берутся только из авторитетных источников. Если вы обнаружили у себя признаки появления грибкового заболевани или же долго и безрезультатно пытаетесь избавиться от этого неприятного недуга, у нас на сайте вы найдете быстрый и простой способ устранения проблемы. Приобщайтесь и живите полноценной, здоровой жизнью. Мы собрали ответы на все вопросы на одном информационном ресурсе.

    ОтветитьУдалить
  5. Бонгакамс - это целый бонг видеочат, который собрал в себе огромное количество различных чатов. На сайте комнат вы можете выбрать собеседника для абсолютно любой темы разговора. Представьте себе, что сотни, а параллельно и многие, с самыми изощренными фантазиями, уже размещены только в каталоге. Единственное, что крайне необходимо, это подобрать тему бонг кам, заглянуть, и вам откроется здесь множество чатов интересующего вас направления. Дает возможность заказчику не только переписываться с заявителем на экране, но и в то же время разговаривать, а если вы просто хотите посмотреть, это все еще возможно. Видеочат бонга уже собрал самых неожиданных девушек для людей. Ты хочешь рыжую? Пожалуйста. Ты хочешь брюнетку или блондинку? Пожалуйста. Вы можете и облысеть, если правильно посмотрите видеочат бонгакамса. Если вы нажмете на чат бонгакамс, вы окажетесь только в комнате с единомышленниками, которые либо просто наблюдают, либо активно общаются и переписываются. Можно даже принять непосредственное участие в bongacams, подключив гарнитуру, или спокойно начать печатать на ресурсе. Все понимают, что сайт бонга кам популярен своим разнообразием и вседозволенностью. Если вам восемнадцать лет, вы получаете возможность безопасно смотреть и изучать порно бонгакамс вместе с нами. В любую погоду, в любое время дня и ночи, посетив бонгакамс, или, где его альтернативно любят называть бонг видеочат, вы найдете горячих моделей и заводных парней, они уже давно разогрелись и сразу намерены заказать откровенное знакомство с пользователями. Вы можете составить список своих самых сокровенных чувств и самых безумных фантазий раньше. Будьте всегда уверены, что, посетив видеочат bongacams позже, все гарантии из вашего списка будут изменены на реальные, даже виртуальные. Поскольку вы дорожили этой цифрой, и поклонник кино, естественно, хотел бы получить работу для получения дополнительной информации о порно видео чат с девушками Пожалуйста, посетите нашу собственную страницу.

    ОтветитьУдалить
  6. Потребительские кредиты на сумму не менее от 1000 до ста тысяч рублей только в диапазоне от 0% до одного% в день на срок от 61 до 180 дней, без наценок и залога. Пск (полная номинальная стоимость кредита) составляет от 182 000 % годовых до 365 000 % годовых. Сумма переплаты по кредиту также зависит от поставленного и срока, на который предоставляется кредит. Требования к клиентам: гражданство российской федерации, возраст от восемнадцати до 75 лет, предъявление документов. Например, был выдан кредит в размере 10 тыс. Руб. Срок действия кредита составляет 70 дней, ставка составляет 1% в день, с аннуитетным (регулярным) платежом в срок каждые две недели в виде 2912,84 руб. Общая сумма составляет 14 564,18 рубля: 10 тысяч рублей основной долг 4564,18 рубля проценты. Так как вы дорожили этой цифрой, поэтому вы спокойно хотели бы получить более подробную информацию о Рейтинг МФО Пожалуйста, посетите нашу собственную страницу.

    ОтветитьУдалить