Путаница с дженериками - PullRequest
0 голосов
/ 10 декабря 2011

у меня

class Foo : public QFrame {...}

и в модуле, когда этот класс используется, у меня есть

QWidget* screen = this->parentWidget();
Foo* foo = (Foo*) screen->findChild<QFrame*>("foo1"); // foo1 is the name of the control from .ui file

и это работает. Если я изменю это на

QWidget* screen = this->parentWidget();
Foo* foo = screen->findChild<Foo*>("foo1"); // foo1 is the name of the control from .ui file

Я получаю эту ошибку компоновщика

Ошибка 4, ошибка LNK2001: неразрешенный внешний символ "public: static struct QMetaObject const Foo :: staticMetaObject " (? staticMetaObject @ Foo @@ 2UQMetaObject @@ B) Foo.obj

В чем разница между двумя фрагментами и почему первый работает, а второй нет?

Ответы [ 2 ]

3 голосов
/ 10 декабря 2011

Вероятно, это связано с тем, что Q_DECLARE_METATYPE отсутствует на Foo class

Из документации Qt

Adding a Q_DECLARE_METATYPE() makes the type 
known to all template based functions

Что-то вроде

class Foo : public QFrame
{
 //everything
}

Q_DECLARE_METATYPE(Foo)
1 голос
/ 10 декабря 2011

В вашем классе Foo, вероятно, отсутствует макрос Q_OBJECT. Добавьте его и, если вы используете QMake, добавьте заголовок в список HEADERS и перезапустите qmake.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...