Как очистить кеш в Qt QMake: нет такого слота, повторяющиеся ошибки

В общем, я пишу приложение Qt. Раньше он работал нормально, но с тех пор, как я перенастроил некоторые имена файлов (в частности, давным-давно у меня были файлы с именами mainwindow.h и .cpp. Я переименовал их в net.h и .cpp соответственно, а недавно изменил вернуться к mainwindow.h и .cpp), он завершается с несколькими ошибками (во время выполнения):

Object::connect: No such slot QWidget::slotName()
Object::disconnect: No such signal QWidget::iconSizeChanged(QSize)
Object::disconnect: No such signal QWidget::toolButtonStyleChanged(Qt::ToolButtonStyle)
Object::connect: No such signal QWidget::iconSizeChanged(QSize)
Object::connect: No such signal QWidget::toolButtonStyleChanged(Qt::ToolButtonStyle)

Единственный слот, который я зарегистрировал в своем классе, — это первый, slotName. Я не уверен, почему он указан как член QWidget, а не моего класса (который является подклассом QWidget). Я знаю, что правильно объявил его, потому что нашел его в файле moc_mainwindow.cpp. И да, у меня есть Q_OBJECT в моем определении класса.

Также возникает другая ошибка, раз в секунду во время работы:

QWidget::metric: Invalid metric command
QPainter::begin: Paint device returned engine == 0, type: 143256176

Как я уже сказал, раньше все это работало отлично, поэтому я не буду публиковать огромные стены кода, если меня об этом не попросят. Я думаю, что это скорее проблема с кешем с QMake. Я пытался удалить все файлы moc, удалить файл проекта, очистить файл проекта и создать новый пустой Makefile и т. д. У кого-нибудь есть идеи?


person Samuel Breese    schedule 23.06.2012    source источник
comment
Поскольку вы изменили имена файлов, изменили ли вы строку #include "ui_filename.h" внутри другого файла и не изменили ее обратно? Чисто снято в темноте, больше ничего явно неладного не вижу.   -  person tmpearce    schedule 23.06.2012
comment
Все было правильно изменено. Как я уже сказал, он компилируется нормально, просто ошибки времени выполнения.   -  person Samuel Breese    schedule 23.06.2012
comment
Некоторое время назад у меня была аналогичная проблема. Мне просто нужно было удалить все скомпилированные файлы, оставив только .cpp (moc_*.cpp тоже были удалены), .h, .pro и любой другой ресурс, который мне был нужен (например, изображения). Таким образом, я заставил приложение qmake воссоздать даже файлы Makefile. Кроме того, я также удалил .pro.user, но я не думаю, что это было необходимо.   -  person Vinícius Gobbo A. de Oliveira    schedule 23.06.2012
comment
@ViníciusGobboA.deOliveira Согласен, мне тоже приходилось делать это пару раз. Файл .pro.user - это настройки проекта, относящиеся к среде, например. закладки, расположение временных файлов сборки и т. д. - вам не нужно это удалять.   -  person cmannett85    schedule 23.06.2012
comment
Согласен, @cbamber85. Я упомянул об этом только потому, что я это сделал. Но, как я уже сказал, я не думаю, что это было необходимо =] вы подтвердили мои мысли =]   -  person Vinícius Gobbo A. de Oliveira    schedule 23.06.2012
comment
@ViníciusGobboA.deOliveira: Я попробовал то, что вы сказали, удалив все, кроме исходных файлов, заново сгенерировав файлы проекта и makefile с нуля, но безуспешно. Я действительно начинаю недоумевать здесь, я, вероятно, должен перейти на cmake :)   -  person Samuel Breese    schedule 24.06.2012


Ответы (1)


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

При отсутствии контроля версий скопируйте свой проект вручную, файл за файлом, в новое место, зафиксируйте его в новом репозитории контроля версий по вашему выбору (локальном!) и скомпилируйте его там.

Обратите внимание, что Qt Creator по умолчанию использует теневые сборки, то есть сборки, которые не находятся в ваших исходных папках. Удаление теневой сборки тривиально: перейдите на один каталог выше вашей исходной папки и найдите папку с длинным именем, начинающимся с имени вашего проекта. Сотрите это, и вам гарантировано отсутствие каких-либо «кешей».

Также обратите внимание, что QMake вообще не имеет кешей. Он перечитывает все файлы, указанные на входе (.pro и его включения), и воссоздает все файлы Makefile с нуля. Вы можете запустить qmake && make clean для очистки, но это не позаботится о файлах из проекта с другой конфигурацией. Увы, такие файлы все равно не должны мешать.

person Kuba hasn't forgotten Monica    schedule 25.06.2012