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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Наследование и система сигналов-слотов.  (Прочитано 3729 раз)
vanessa
Гость
« : Июль 01, 2011, 11:28 »

Есть класc, наследованный от QDialog
Код:
#ifndef __PANEL_REG__
#define __PANEL_REG__

#include <QtGui>
#include <QDebug>

class TrendChart;
class IoDev;

//namespace Ui {
//    class panelReg;
//}
#include "ui_panelReg.h"

class RpanelReg: public QDialog
{
Q_OBJECT
public:
    RpanelReg(IoDev &source,int n=0,QWidget *p=NULL,QString cfName=":/text/reg.txt",QString tableName="trend");
    ~RpanelReg();

protected slots:
    void changeReg(int Index);
    void Control();
    void runTrend();
    
    void updateData();
    // Ctrl
    void setCtrlValue(double v);
    void setCtrlValue(int v);
    // Parm
    void setParmValue(double v);
    void setParmValue(int v);
    void setParmAM(int v);
    void setParmRej(int v);
    void setParmRev();
    void setParmKprSig(int v);
    void setParamMode(bool v);
    
    void setGraph();
    
protected:
    Ui::panelReg *ui;
    int RegNum;

    QVector<QStringList> RegDes;
    IoDev &src;

    TrendChart *trChart;
    QVector<double> v;

    QHash<QString, Ri::Index> ctrlSearch;    
    QString tblName;

    double kk_1 ;  
};


#endif


Мне нужно сделать наследника этого класса, нужно немного изменить его поведение. наследую его так
Код:
#ifndef VPANELREG_H
#define VPANELREG_H
#include <panelReg.h>

class VpanelReg : public RpanelReg
{
    Q_OBJECT
public:
    VpanelReg(IoDev &source,int n=0, QWidget *p=NULL,QString cfName=":/text/reg.txt",QString tableName="trend");

    void setRegMode(int RegMode) {rm=RegMode;}

private slots:
    void checkChangeReg(int);
private:
    int rm;

};

#endif // VPANELREG_H

но вот только при связывании получаю ошибки
Код:
build/mnemo.o: In function `~VpanelReg':
/home/vanessa/src/work/dondushen/viparka/scada/vpanelreg.h:5: undefined reference to `vtable for VpanelReg'
/home/vanessa/src/work/dondushen/viparka/scada/vpanelreg.h:5: undefined reference to `vtable for VpanelReg'
build/vpanelreg.o: In function `VpanelReg':
/home/vanessa/src/work/dondushen/viparka/scada/vpanelreg.cpp:5: undefined reference to `vtable for VpanelReg'
/home/vanessa/src/work/dondushen/viparka/scada/vpanelreg.cpp:5: undefined reference to `vtable for VpanelReg'
build/vpanelreg.o: In function `VpanelReg::tr(char const*, char const*)':
/home/vanessa/src/work/dondushen/viparka/scada/vpanelreg.h:7: undefined reference to `VpanelReg::staticMetaObject'
collect2: ld returned 1 exit status

Правда если убрать Q_OBJECT из класса-наследника то все собирается, но естественно слот, что в наследнике определён не работает, функция connect говорит
Код:
Object::connect: No such slot RpanelReg::checkChangeReg(int) in vpanelreg.cpp:8
Object::connect:  (sender name:   'regList')
Object::connect:  (receiver name: 'panelReg')

то-есть она просто ищет слот checkChangeReg в родителе, хотя он определен в наследнике.
Как с этим бороться ?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июль 01, 2011, 11:34 »

А если деструктор (пусть даже пустой) определить, как он просит? С реализацией в cpp.
У конструктора реализация есть?

Q_OBJECT убирать нельзя.
« Последнее редактирование: Июль 01, 2011, 11:36 от LisandreL » Записан
vanessa
Гость
« Ответ #2 : Июль 01, 2011, 11:54 »

1. Реализация в cpp для конструктора есть.
2. дописал для наследника пустой деструктор
3. количестрво и качество ругательств gcc изменилось
Код:
build/vpanelreg.o: In function `VpanelReg':
/home/vanessa/src/work/dondushen/viparka/scada/vpanelreg.cpp:5: undefined reference to `vtable for VpanelReg'
/home/vanessa/src/work/dondushen/viparka/scada/vpanelreg.cpp:5: undefined reference to `vtable for VpanelReg'
build/vpanelreg.o: In function `~VpanelReg':
/home/vanessa/src/work/dondushen/viparka/scada/vpanelreg.cpp:11: undefined reference to `vtable for VpanelReg'
/home/vanessa/src/work/dondushen/viparka/scada/vpanelreg.cpp:11: undefined reference to `vtable for VpanelReg'
build/vpanelreg.o: In function `VpanelReg::tr(char const*, char const*)':
/home/vanessa/src/work/dondushen/viparka/scada/vpanelreg.h:7: undefined reference to `VpanelReg::staticMetaObject'
collect2: ld returned 1 exit status
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #3 : Июль 01, 2011, 11:59 »

qmake && make clean && make
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vanessa
Гость
« Ответ #4 : Июль 01, 2011, 12:00 »

Вобщем у QtCreator’а какой-то затык с проектом получился, для моего класса не генерировался moc файл. Вручную прибил Makefile для проекта, запустиль qmake понову и после этого все собралось. Хотя перед этим командовал креатеру clean, Run qmake и Rebuild project .... к чему б это оно ?
Записан
ieroglif
Гость
« Ответ #5 : Июль 01, 2011, 12:24 »

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


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