QT и никакой moc_*.cpp файл

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

16
задан cbuchart 4 October 2017 в 14:47
поделиться

4 ответа

Неопределенная ссылка на "vtable для MyDialog" вызывается, потому что нет никакого файла MOC. Большинство компиляторов C++ создает vtable определение в объектном файле, содержащем первую виртуальную функцию. При разделении на подклассы спокойного объекта и использовании макроса Q_OBJECT, это будет в moc*.cpp файле. Поэтому эта ошибка означает, что файл MOC отсутствует.

возможные проблемы, о которых я могу думать:

  1. заголовочный файл для класса MyDialog.h не добавляется к ЗАГОЛОВКАМ в qmake файле.

  2. Вы выполнили qmake для генерации make-файла прежде добавление макроса Q_OBJECT. Это создало make-файл без правил MOC. Это легко фиксируется путем простого выполнения qmake снова.

  3. Ваше диалоговое окно происходит больше чем из одного класса, и QDialog не является первым классом, из которого это происходит. Для qmake для работы правильно QObject получил потребности базового класса быть первым классом, который наследован от.

  4. при использовании спокойного Создателя Вы могли бы получить эту ошибку, если бы Ваше предыдущее развертывание было отказавшим из-за некоторой причины (как приложение, уже работающее). В этом случае просто сделайте 'Чистый Проект' и затем 'Восстанавливает Проект' и затем 'Выполнение' для развертывания.

34
ответ дан 30 November 2019 в 16:37
поделиться

Вы используете qmake? Возможно, Вы не добавили его к Вашему .cpp файл к Вашим ИСТОЧНИКАМ и.h файл к Вашей переменной ЗАГОЛОВКОВ в qmake файле?

0
ответ дан 30 November 2019 в 16:37
поделиться

Я кротко предлагаю, чтобы Вы использовали CMake для создания спокойных программ в Windows. Это сохранит Вас, не забывают добавлять соответствующие файлы к его файлам типа "build".

дополнительное значение - то, что можно генерировать make/nmake файлы типа "build" от него, файлы решения для Visual Studio. И если Вы скомпилируете QT из источника для Visual Studio, то Вы будете в состоянии и кодировать и создать с IDE/компилятором MS.

Это, конечно, при использовании Visual Studio вообще.

0
ответ дан 30 November 2019 в 16:37
поделиться

Сообщение неопределенной ссылки на `vtable for MyDialog 'также может быть результатом отсутствующей реализации (в MyDialog) чисто виртуальной функции в классе, из которого происходит MyDialog.

0
ответ дан 30 November 2019 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: