Можно ли смешивать полученные на основе С++ классы с Qt Q_OBJECT?
В моем приложении у меня есть следующая иерархия классов:
class Word
{
...
}
template <typename T> class Dictionary
{
...
};
class WordDictionary : public Dictionary<Word>
{
Q_OBJECT
...
}
Класс WordDictionary анализирует словарь, который занимает много времени. Я запускаю функцию синтаксического анализа из отдельного потока, и я хочу, чтобы он мог время от времени сигнализировать поток графического интерфейса, чтобы предоставлять обновления прогресса на основе текущего синтаксического номера строки. Поэтому я хочу, чтобы это был Q_OBJECT. Я попытался сделать словарь базового класса Q_OBJECT, но получил сообщение о том, что шаблоны Q_OBJECT не поддерживаются. Когда я удалил макрос, оставив только WordDictionary как Q_OBJECT, я получаю кучу сообщений об ошибках общей формы:
.\GeneratedFiles\Release\moc_dictionary.cpp(44): ошибка C2039: "staticMetaObject": не является членом "Словаря"
с
[
T = Слово
]
Есть ли что-нибудь, что я могу сделать, чтобы сделать класс WordDictionary, полученный на основе шаблона, Q_OBJECT, отличным от жесткого кодирования функций шаблона внутри него, создавая много шаблонов?
изменить: Изменение объявления шаблона:
template <typename T> class Dictionary : public QObject
сделал компиляцию кода. Я не уверен, что я не делаю что-то глупое, и если это будет работать правильно, тем не менее.
Ответы
Ответ 1
Вы не можете сделать это напрямую, но есть полезные рабочие раунды. См. Статью здесь.
Хотя теоретически возможно moc для обработки шаблонов, это будет чрезвычайно сложно реализовать, и было бы крайне нецелесообразно использовать: Для каждого экземпляра шаблона moc должны были бы создать соответствующие метаобъектный код и сгенерированный код должен быть включен один раз на единицу связи, которая становится кошмар для поддержания шаблона класс используется с тем же шаблоном параметр в другой компиляции ед.
Если сигналы и слоты не требуются параметр шаблона, который должен быть частью прототип, обходным путем является сделать класс шаблона наследованием Подкласс QObject, который обеспечивает требуемые сигналы и слоты. Если сигналов и слотов необходимо использовать параметры шаблона, Наблюдатель шаблон является альтернативой.
Ответ 2
Я просто пробовал этот код, и он компилируется и работает нормально:
#include <QtCore/QCoreApplication>
#include <QObject>
class Word
{
};
template <typename T> class Dictionary
{
};
class WordDictionary : public Dictionary<Word>, QObject
{
Q_OBJECT
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
WordDictionary wd();
return a.exec();
}
Может быть, я что-то пропустил?