LINUX.ORG.RU

Qt + QObject + template...


0

1

Берем QAbstractItemModel который потомок QObject`a и опредетяем его потомка:

template<typename T> myclass : public QAbstractItemModel {....};

Естесно MOC шаблоны не понимает и этот myclass не может содержать Q_OBJECT и MOCом не обрабатывается, но в нем (myclass) переопределяются тока чисто виртуальные функции от QAbstractItemModel не сигналы/слоты я в myclass не трогаю, интернационализацию тоже, тока если объектную иерархию пользую (ту что указатель на parent в конструкторе).

Короче такое работать будет (компилироваться оно компилится) или я велосипед Qt наглым образом обманываю и он мне этого не простит?

Делаем класс QObjMyClass, вносим все что надо от moc'а. Помним, что moc работает только со статикой (не каких шаблонов)

Делаем наш MyTemplClass, наследую его от QObjMyClass

Профит

Все можно сделать и в одном файле.

Это если тебе надо добавить QMetaInfo

Если нет (то есть нет макроса Q_OBJECT, Signal/slots) - то можешь делать что хочешь

Локализация работает по поиску строку tr, trUtf8, QT_TR, и не как от шаблонов не зависит

namezys ★★★★
()
Ответ на: комментарий от panter_dsd

Не хочу плодить три одинаковые модели для немного похожих классов, которые имеют схожий интерфейс (функции name() и clone()) но на этом сходство заканчивается и идейно они никак не связаны и общего предка иметь не должны, а модели для них одинаковы как две капли воды вот только хранят они QList<someclass*> и использут someclass->name() кое где, так что хранить что-то отличное от QList<someclass*> (ну там void* или QVariant не выход). Хочется забубуенить шаблон для этой модели и забыть про неё навсегда.

НО смущает тока то что я в классе производном от QObject не использую Q_OBJECT и не ействую на него MOCом. С другой стороны я в этом классе метаобъектный функционал не трогаю, но не факт что Qt не пользует его для моей модели в собственных нуждах. Тут я не до конца догоняю будет Qt выдеть мою модеть как QAbstractItemModel или вообще никак видеть не будет и развалиться.

mskmsk1985
() автор топика
Ответ на: комментарий от namezys

чет такое я вообщето и сотворяю, но не уверен что будет работать.

ЗЫ: про локализацию: та самая tr, trUtf8 и пр tr.. и определяется в Q_OBJECT если че. Я как раз имел ввиду что никаких запчастей от этого велосипеда (Q_OBJECT) не пользую.

mskmsk1985
() автор топика
Ответ на: комментарий от namezys

Не надо экспериментировать, см qobjectdefs.h и правда tr в public секции объевлен, так что доступен. С lupdate правда будет трабла так как контекст переводмых строк она определит неправильно если пользовать tr родительских классов.

mskmsk1985
() автор топика
Ответ на: комментарий от namezys

Неа, контекст определяет lupdate по тому что стоит перед последним :: в функции где встретился tr, а tr родительского класса забивает в QApplication::translate контекст на основании метаинформации родительского класса.

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

Не хочу плодить три одинаковые модели для немного похожих классов, которые имеют схожий интерфейс (функции name() и clone()) но на этом сходство заканчивается и идейно они никак не связаны и общего предка иметь не должны, а модели для них одинаковы как две капли воды вот только хранят они QList<someclass*> и использут someclass->name() кое где, так что хранить что-то отличное от QList<someclass*> (ну там void* или QVariant не выход).

когда такие штуки происходят, чаще всего это свидетельство плохого дизайна, так что начинайте прямо с консерватории

shty ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.