Название: Наследование и система сигналов-слотов.
Отправлено: 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 и компиляешь его, то при последующем включении макроса надо сначала почистить билды.
|