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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибки сборки программы после добавления нового класса.  (Прочитано 5333 раз)
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
Хотя если собирать то окно само по себе то все собирается. Как это полечить ?
Записан
BRE
Гость
« Ответ #1 : Февраль 01, 2010, 18:14 »

Запустить qmake.
Записан
vanessa
Гость
« Ответ #2 : Февраль 01, 2010, 18:15 »

Я проблему устранил, изменил порядок файлов в переменных HEADERS,SOUCES и  FORMS в pro-файле но все-равно кто-то сможет мне объяснить почему оно не компоновалось ?

Запустить qmake.

спасибо за совет но я про это не забыл, запускал и не раз и make clean && qmake && make тоже запускал, не помогало
« Последнее редактирование: Февраль 01, 2010, 18:17 от vanessa » Записан
BRE
Гость
« Ответ #3 : Февраль 01, 2010, 18:19 »

Я проблему устранил, изменил порядок файлов в переменных HEADERS,SOUCES и  FORMS в pro-файле но все-равно кто-то сможет мне объяснить почему оно не компоновалось ?
Потому, что не был запущен qmake.
После добавления любых файлов в проект, нужно запускать эту утилитку, она добавить поддержку для генерации moc-файла.
Записан
SASA
Гость
« Ответ #4 : Февраль 02, 2010, 11:34 »

А это для чего нужно?
Цитировать
public Ui::AmVater
Записан
BRE
Гость
« Ответ #5 : Февраль 02, 2010, 11:56 »

Что бы "примешать" к классу его ui-часть.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Февраль 02, 2010, 13:09 »

Цитировать
А это для чего нужно?

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

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

а пишется просто:
Код:
...
    Label->setText(); и т.п.
...
что покороче будет Улыбающийся
« Последнее редактирование: Февраль 02, 2010, 13:11 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Февраль 02, 2010, 16:12 »

пишу:
Код:
...
class AmVater: public QDialog, private Ui::AmVater
...

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

А как это связано?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Февраль 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 я про это имел ввиду
« Последнее редактирование: Февраль 02, 2010, 16:55 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
vanessa
Гость
« Ответ #9 : Февраль 02, 2010, 17:44 »

у меня наверное неправильный uic и он делает неправильные h-файлы (с) но я вроде как сам того не подозревая всегда писAл
Код:
Label->setText(tr("Label text")); 
без префикса ui. и оно почему-то работало....
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Февраль 02, 2010, 18:16 »

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

ясно, я просто упустил предыдуший пост, без него смысл меняется
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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