Russian Qt Forum

Программирование => С/C++ => Тема начата: vanessa от Июль 01, 2011, 11:28



Название: Наследование и система сигналов-слотов.
Отправлено: 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 в родителе, хотя он определен в наследнике.
Как с этим бороться ?


Название: Re: Наследование и система сигналов-слотов.
Отправлено: LisandreL от Июль 01, 2011, 11:34
А если деструктор (пусть даже пустой) определить, как он просит? С реализацией в cpp.
У конструктора реализация есть?

Q_OBJECT убирать нельзя.


Название: Re: Наследование и система сигналов-слотов.
Отправлено: vanessa от Июль 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


Название: Re: Наследование и система сигналов-слотов.
Отправлено: Пантер от Июль 01, 2011, 11:59
qmake && make clean && make


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


Название: Re: Наследование и система сигналов-слотов.
Отправлено: ieroglif от Июль 01, 2011, 12:24
это нормально.
если определяешь класс без макроса Q_OBJECT и компиляешь его, то при последующем включении макроса надо сначала почистить билды.