Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: vanessa от Февраль 01, 2010, 18:02



Название: Ошибки сборки программы после добавления нового класса.
Отправлено: vanessa от Февраль 01, 2010, 18:02
Нужно мне было добавить диалоговое окно к программе, сделал класс
Код
C++ (Qt)
#include <QtGui>
#include ".ui/ui_amVater.h"
 
class RIoNetClient;
 
class RamVater: public QDialog, public Ui::AmVater
{
Q_OBJECT
public:
   RamVater(RIoNetClient *source,QWidget *p=NULL);
   //~RamVater();
 
private slots:
   void updateData(); // поновлення даних у вікні
   void slotSetAM(int v); // перемикач ручний-автомат
   void slotSetValue(double v); // встановлення параметрів
   void slotSetValue(int v); // встановлення парамертів
   void slotManY(int v);  //ручне упарвління клапаном
 
private:
   RIoNetClient *src;
};
 
реализация методов пока просто пустышки, кноструктор такой
Код
C++ (Qt)
RamVater::RamVater(RIoNetClient *source,QWidget *p/*=NULL*/) : QDialog(p) ,src(source)
{
   setupUi(this);
}
 

добавил эти три файла (.ui .h и .cpp ) pro-файлу сгенерировал новый Makefile. Компиляция происходит без ошибок а вот на этапе компоновки вылазит следующее
Код:
.obj/amVater.o: In function `RamVater':
/home/vanessa/src/QT4/src/vipgr/client/amVater.cpp:5: undefined reference to `vtable for RamVater'
/home/vanessa/src/QT4/src/vipgr/client/amVater.cpp:5: undefined reference to `vtable for RamVater'
/home/vanessa/src/QT4/src/vipgr/client/amVater.cpp:5: undefined reference to `vtable for RamVater'
/home/vanessa/src/QT4/src/vipgr/client/amVater.cpp:5: undefined reference to `vtable for RamVater'
collect2: ld returned 1 exit status
Хотя если собирать то окно само по себе то все собирается. Как это полечить ?


Название: Re: Ошибки сборки программы после добавления нового класса.
Отправлено: BRE от Февраль 01, 2010, 18:14
Запустить qmake.


Название: Re: Ошибки сборки программы после добавления нового класса.
Отправлено: vanessa от Февраль 01, 2010, 18:15
Я проблему устранил, изменил порядок файлов в переменных HEADERS,SOUCES и  FORMS в pro-файле но все-равно кто-то сможет мне объяснить почему оно не компоновалось ?

Запустить qmake.

спасибо за совет но я про это не забыл, запускал и не раз и make clean && qmake && make тоже запускал, не помогало


Название: Re: Ошибки сборки программы после добавления нового класса.
Отправлено: BRE от Февраль 01, 2010, 18:19
Я проблему устранил, изменил порядок файлов в переменных HEADERS,SOUCES и  FORMS в pro-файле но все-равно кто-то сможет мне объяснить почему оно не компоновалось ?
Потому, что не был запущен qmake.
После добавления любых файлов в проект, нужно запускать эту утилитку, она добавить поддержку для генерации moc-файла.


Название: Re: Ошибки сборки программы после добавления нового класса.
Отправлено: SASA от Февраль 02, 2010, 11:34
А это для чего нужно?
Цитировать
public Ui::AmVater


Название: Re: Ошибки сборки программы после добавления нового класса.
Отправлено: BRE от Февраль 02, 2010, 11:56
Что бы "примешать" к классу его ui-часть.


Название: Re: Ошибки сборки программы после добавления нового класса.
Отправлено: kuzulis от Февраль 02, 2010, 13:09
Цитировать
А это для чего нужно?

я тоже пользуюсь именно этим приемом, только вместо:
Код:
...
class RamVater: public QDialog, public Ui::AmVater
...
пишу:
Код:
...
class AmVater: public QDialog, private Ui::AmVater
...

ИМХО, в этом случае не нужно писать всякие там :
Код:
...
    ui->Label->setText(); и т.п.
...

а пишется просто:
Код:
...
    Label->setText(); и т.п.
...
что покороче будет :)


Название: Re: Ошибки сборки программы после добавления нового класса.
Отправлено: Alex Custov от Февраль 02, 2010, 16:12
пишу:
Код:
...
class AmVater: public QDialog, private Ui::AmVater
...

а пишется просто:
Код:
...
    Label->setText(); и т.п.
...
что покороче будет :)

А как это связано?


Название: Re: Ошибки сборки программы после добавления нового класса.
Отправлено: kuzulis от Февраль 02, 2010, 16:50
Цитировать
А как это связано?
ну вот же разница:

1.
Код:
class MyDialog: public QDialog
{
    Q_OBJECT

public:
    MyDialog(QWidget *parent = 0);

private:
    Ui::MyDialog ui;
};

MyDialog::MyDialog(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);
    ...
    ui.Label->setText(tr("Label text"));
    ...
}
2.
Код:
class MyDialog: public QDialog, private Ui::MyDialog
{
    Q_OBJECT

public:
    MyDialog(QWidget *parent = 0);
};

MyDialog::MyDialog(QWidget *parent)
    : QDialog(parent)
{
    setupUi(this);
    ...
    Label->setText(tr("Label text"));
    ...
}

видно разницу? :)

+ вместо public пишу private я про это имел ввиду


Название: Re: Ошибки сборки программы после добавления нового класса.
Отправлено: vanessa от Февраль 02, 2010, 17:44
у меня наверное неправильный uic и он делает неправильные h-файлы (с) но я вроде как сам того не подозревая всегда писAл
Код:
Label->setText(tr("Label text")); 
без префикса ui. и оно почему-то работало....


Название: Re: Ошибки сборки программы после добавления нового класса.
Отправлено: Alex Custov от Февраль 02, 2010, 18:16
+ вместо public пишу private я про это имел ввиду

ясно, я просто упустил предыдуший пост, без него смысл меняется