Russian Qt Forum
Ноябрь 24, 2024, 13:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как разместить код Qt-класса в main.cpp?  (Прочитано 15879 раз)
d13mon
Гость
« : Февраль 25, 2013, 13:05 »

День добрый,

Давно интересует один вопрос. Создаем простейший проект (использую MSVC2010) Qt Application - там класс производный от QWidget (в 2-х файлах - .h и .cpp) и main.cpp. Компилируем, собираем, всё ок. Затем пихаем весь код в main.cpp:
Код:
#include <QtGui/QWidget>
#include <QtGui/QApplication>

class TestWidget : public QWidget
{
Q_OBJECT

public:
TestWidget(QWidget *parent = 0, Qt::WFlags flags = 0)
: QWidget(parent, flags)
{
}
~TestWidget(){}
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TestWidget w;
w.show();
return a.exec();
}

и линковщик выдает странные ошибки, характерные для случаев, когда с  Q_OBJECT что-то не так.
Код:
main.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall TestWidget::metaObject(void)const " (?metaObject@TestWidget@@UBEPBUQMetaObject@@XZ)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall TestWidget::qt_metacast(char const *)" (?qt_metacast@TestWidget@@UAEPAXPBD@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall TestWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@TestWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)

Кто-нибудь знает, из-за чего это и как побороть?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 25, 2013, 13:07 »

#include "main_moc.cpp" в самом низу main.cpp сделай.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Февраль 25, 2013, 13:10 »

прогони main.cpp через moc:
Код
DOS
moc -o moc_main.cpp main.cpp
Полученный moc_main.cpp в ставь в самом конце main.cpp через
Код
C++ (Qt)
#include "moc_main.cpp"
Записан

Qt 5.11/4.8.7 (X11/Win)
d13mon
Гость
« Ответ #3 : Февраль 25, 2013, 13:11 »

#include "main_moc.cpp" в самом низу main.cpp сделай.

О,спасибо

Правда, помогло не #include "main_moc.cpp", а #include "main.moc"
Записан
d13mon
Гость
« Ответ #4 : Февраль 25, 2013, 13:19 »

прогони main.cpp через moc:
Код
DOS
moc -o moc_main.cpp main.cpp
Полученный moc_main.cpp в ставь в самом конце main.cpp через
Код
C++ (Qt)
#include "moc_main.cpp"

Попробовал так тоже, пишет
Код
DOS
D:\WORK\PROJECTS\CPlusPlus\QT\Qt_training\TestWidget>moc -o moc_main.cpp main.cpp
main.cpp(0): Note: No relevant classes found. No output generated.

На выходе получаю пустой moc_main.cpp
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Февраль 25, 2013, 15:10 »

прогони main.cpp через moc:

если просто добавить #include "main.moc", то qmake сам определит, что нужно сгенерить main.moc и создаст правила.
Записан
schmidt
Гость
« Ответ #6 : Февраль 26, 2013, 11:02 »

Затем пихаем весь код в main.cpp.

У меня только один к вам вопрос: зачем? Непонимающий
Записан
VozaMFC
Гость
« Ответ #7 : Февраль 26, 2013, 17:50 »

Затем пихаем весь код в main.cpp.

У меня только один к вам вопрос: зачем? Непонимающий

Что бы в одном файле все было.
Записан
Bepec
Гость
« Ответ #8 : Февраль 26, 2013, 18:51 »

И получаем дикую головную боль при использовании другой IDE  Веселый

PS к примеру тот же VS  Веселый
Записан
twp
Гость
« Ответ #9 : Февраль 26, 2013, 22:52 »

А какие проблемы при использовании в VS такого подхода?
Записан
Bepec
Гость
« Ответ #10 : Февраль 27, 2013, 06:54 »

VS создаёт моки и прочее в процессе компиляции кода. Причём местонахождение папки для генерируемых файлов меняется в настройках проекта. Т.е. мне например удобно, что они сразу улетают в темп и не мучают меня своим присутствием в папке с исходниками.

А раз их местонахождение может измениться за 5 секунд, значит чтобы их найти, необходимо прописывать абсолютные пути для их подключения.

Проще выражаясь - создаётся фиг пойми где, а даже если и пойми где, нужен абсолютный путь.

PS кто-то скажет - так тебе и надо, а я скажу - нафиг мне файл, который каждый раз заново создаётся, в папке с проектом.
Записан
schmidt
Гость
« Ответ #11 : Февраль 27, 2013, 09:10 »

Что бы в одном файле все было.

 Смеющийся Смеющийся 5 баллов!

Запихнув все классы проекта в один файл вы не получите ничего, кроме головной боли. С таким подходом у вас получится не то что винегрет вместо проекта, а каша из 10 круп. Как только число ваших классов приблизится к десятку, а код каждого класса перестанет умещаться в окне редактора, вы проклянёте себя самыми последними словами после 1-2х дней работы с этой высокохудожественной свалкой Улыбающийся
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #12 : Февраль 27, 2013, 09:21 »

Запихнув все классы проекта в один файл вы не получите ничего, кроме головной боли. Как только число ваших классов приблизится к десятку вы проклянёте себя самыми последними словами после 1-2х дней работы с этой высокохудожественной свалкой Улыбающийся
Как легко вешать ярлыки. А может у него НИКОГДА в этом проекте не будет десятка классов? Будьте менее категоричны.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Февраль 27, 2013, 10:52 »

Не понимаю "непониманий" schmidt и Bepec.
Для серьёзных проектов, конечно, сей случай навряд ли подойдёт.
Но для test-case-ов и для обкатки какого-нибудь случая считаю такой подход самым оптимальным.
Сам здесь уже не первый год пользуюсь им для рабочих примеров.
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #14 : Февраль 27, 2013, 10:55 »

Выражу мысль так.

Для использующий креатор - это, без сомнения, удобное решение для тестовых проектиков.

Для тех, кто НЕ использует креатор - это решение будет удобно лишь после настройки IDE и, возможно, шаманства с путями.

Для тех, кто соберётся передавать проект кому-то - это создание проблем.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 23.