Bonjour,
dans le cadre d'un projet, j'essaie de profiter de l'héritage pour simplifier certaines routines (et la redondance du code).
Sauf que même si tout compile bien, lorsque je fais un new de ma nouvelle classe, je reçois un message pas sympathique du tout :
Unhandled exception at 0x500f4dfa in monprojet.exe 0xC00000005: Access violation reading location 0xcdcdcdd1
C'est moche!!!!
Je dois certainement faire une erreur bête mais comme je n'ai pas réussi à identifier la cause, me voilà après une recherche infructueuse internet...
Voici l'architecture (l'erreur d'après le debuggeur arrive dans Q_OBJECT
Ma classe abstraite :
le cpp associé (simplifié) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class TypeWidgetUI : public QWidget, protected Ui::TypeWidget_Form { Q_OBJECT public: TypeWidgetUI(); TypeWidgetUI(QWidget* parent); protected slots: void on_addButton_clicked(); protected: virtual void actionButton()=0;//to redefine in each child
Et une de mes classes héritées :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 TypeWidgetUI::TypeWidgetUI(){} TypeWidgetUI::TypeWidgetUI(QWidget* parent):QWidget(parent){} TypeWidgetUI::on_addButton_clicked(){ actionButton(); }
et le .cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class ObserverWidgetUI : public TypeWidgetUI { public: ObserverWidgetUI(); protected: void actionButton(); };
La compilation fonctionne très bien mais je me casse les dents à l'exécution...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 ObserverWidgetUI::ObserverWidgetUI():TypeWidgetUI(observer){ typeName->setTitle(tr("Observers")); } void ObserverWidgetUI::actionButton(){ QMessageBox *box = new QMessageBox(tr("Question"), tr("Do you want to add an existing observer or create a new one?"), QMessageBox::NoIcon, QMessageBox::Open, QMessageBox::Apply, QMessageBox::Cancel); box->button(QMessageBox::Open)->setText(tr("Add")); box->button(QMessageBox::Apply)->setText(tr("New")); int valueButton = box->exec(); if(valueButton == QMessageBox::Open){ QString fileName = QFileDialog::getOpenFileName(this, tr("Choose ")+ _typeName +tr(" file"), QString("c:/tmp/"), tr("Scilab files")+" (*.sce)"); if(!fileName.isEmpty() && QFile::exists(fileName)){ //call method to add a observer } } else if(valueButton == QMessageBox::Apply){ //call method to create a new observer //if ok call method to add a device } box->deleteLater(); }
Si vous avez une idée d'où vient le problème? (les fichiers moc sont bien générés pour la classe abstraite et la classe fille).
J'hésite à ajouter Q_OBJECT dans la classe fille car je voudrais que les signaux ne soit gérés qu'au niveau de la classe mère (j'ai fait l'essai avec et sans et j'ai toujours le même échec à l'exécution - ce qui ne semble normal).
Merci de votre aide
Partager