IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Problème "vtable" lors de la création d'une appli Qt


Sujet :

Qt

  1. #1
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut Problème "vtable" lors de la création d'une appli Qt
    Bonjour à tous,

    Je suis en train de faire mes premiers pas en Qt.

    Pour m'entrainer un peut je suis en train de faire des petites applications afin de voir la philosophie de la lib Qt.

    Je voudrais faire un convertisseur Euro-Dolar comme exemple afin de voir comment ça marche les slots, les connexions etc...

    J'ai trouve l'erreur " home/qt_slots/src/converter.cpp:54: undefined reference to `vtable for Converter' ". Je pense qu'il est lié à l'heritage virtuel de Converter (?).

    Mon code est le suivant:

    MAIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <QApplication>
    #include "converter.h"
     
    int main(int argc, char *argv[])
    {
     
    	QApplication app(argc, argv);
    	Converter aConverter;
     
          	return app.exec();
    }
    converter.h
    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
     
    #include <QDialog>
     
    class Converter : public QDialog
    {
    Q_OBJECT
     
    public :
    Converter();
    ~Converter();
     
    public slots : 
    	void euroChanged(int aNum); 
     
    private : 
    	int _euroValue;
    };
    converter.cpp
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    #include <QCoreApplication>
     
    #include "converter.h"
     
    #include <QPushButton>
    #include<QGridLayout>
    #include<QLabel>
    #include <QLineEdit>
     
     
     
    Converter::Converter()
    {
    	QWidget aWindow;
     
    	//declaring a main layout in a window
    	QGridLayout * aMainLayout = new QGridLayout(&aWindow);	
     
    	//declaring the labels
    	QLabel * aLabel1 = new QLabel("Euros");
    	QLabel * aLabel2 = new QLabel("Dolars");
     
    	//declaring a text line
    	QLineEdit * aLine1 = new QLineEdit;
    	QLineEdit * aLine2 = new QLineEdit;
     
    	//declaring the button
    	QPushButton * aButtonConvert = new QPushButton("Convert");
    	QPushButton * aButtonQuit = new QPushButton("Quit");
     
    	//adding the labels in the main layout
    	aMainLayout->addWidget(aLabel1,0,0);
    	aMainLayout->addWidget(aLine1,0,1);
     
    	aMainLayout->addWidget(aLabel2,1,0);
    	aMainLayout->addWidget(aLine2,1,1);	
     
    	//adding the button onto the main layout
    	aMainLayout->addWidget(aButtonQuit,2,0);
    	aMainLayout->addWidget(aButtonConvert,2,1);
    	aWindow.show();
     
    	//catching the signal and executing the callback
    	QObject::connect(aButtonQuit, SIGNAL(clicked()), this, SLOT(quit()));
     
    	QObject::connect(aButtonConvert,SIGNAL(clicked()), this, SLOT(euroChanged(4)));
     
    //Comment prendre la valeur du LineEdit Euro à la place de 4 ??
    };
     
    Converter::~Converter()
    {};
     
    void Converter::euroChanged(int iNum)
    {
    //int aNum = iString.toInt();
    qDebug("Hello from euroChanged");
    //setEuroValue(aNum);
     
    //Comment renvoyer la valeur sur la Line Edit des Dolars ??
    };
    Aussi j'ai 3 questions de plus...

    Comment prendre la valeur du LineEdit Euro à la place de 4 pour la recupérer dans la méthode euroChanged ?

    Comment renvoyer le résultat à la LineEdit Dolar une fois qu'on a fait la conversion ?

    Pouvez vous me donner des conseilles pour avoir une structure de l'application (conseilles de bonne programmation en général)?

    Merci de votre aide, vous etes super !

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Pour la première question : http://qt.developpez.com/faq/?page=qt4Core#linkvtable

    Sinon il n'est pas conseillé de créer une variable QWidget par valeur, mais toujours par pointeur. D'ailleurs, pourquoi créer un widget ainsi par valeur qui sera détruit à la sortie du constructeur alors que la boîte de dialogue elle-même est vide

  3. #3
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut HELP !!
    J'ai fait un clean et cela a marché, merci.

    J'ai également mis QWidget * aWindow,... comme tu suggères mais je me suis pris un core dumped.

    A quoi c'est du ça ?

    Quelqu'un peux m'aider ?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    La question que je me pose, c'est à quoi ce truc sert ?

  5. #5
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Je pense que pour lui, le aWindow est la boîte de dialogue à afficher, ce qui ne sert à rien ici, vu que Converter hérite de QDialog.
    Je pense qu'il faut, sans regarder en détails, c'est possible que j'oublie des trucs, virer ce aWindow, faire un setLayout avec le layout créé dans le constructeur, et afficher la boite de dialogue dans la fonction main avec aConverter.show().

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est aussi ce que je me dis, mais je voulais qu'il me le dise

  7. #7
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut
    Merci de m'avoir aidé ! C'est très sympa... mais s'il te plait, Milles, je te demande d'avoir un peu de pacience avec moi car c'est la première fois que j'utilise cette bibliotèque et en plus je ne suis pas un pro de la programmation, c'est pourquoi je vous demande de l'aide sur cette forum...

    Sinon, j'ai un dernier pb. Mes "connect" ne marchent pas... vous pouvez me dire pourquoi ?

    Mon code actuellement est (je mets seulement la partie modifié) :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Converter::Converter()
    {
     
    	QGridLayout * aMainLayout = new QGridLayout;
     
    	//declaring the labels
    	QLabel * aLabel1 = new QLabel("Euros");
    	QLabel * aLabel2 = new QLabel("Dolars");
     
    	//declaring a text line
    	QLineEdit * aLine1 = new QLineEdit;
    	QLineEdit * aLine2 = new QLineEdit;
     
    	//declaring the button
    	QPushButton * aButtonConvert = new QPushButton("Convert");
    	QPushButton * aButtonQuit = new QPushButton("Quit");
     
    	//adding the labels in the main layout
    	setLayout(aMainLayout);
     
    	aMainLayout->addWidget(aLabel1,0,0);
    	aMainLayout->addWidget(aLine1,0,1);
    	aMainLayout->addWidget(aLabel2,1,0);
    	aMainLayout->addWidget(aLine2,1,1);	
     
    	//adding the button onto the main layout
    	aMainLayout->addWidget(aButtonQuit,2,0);
    	aMainLayout->addWidget(aButtonConvert,2,1);
     
    	//catching the signal and executing the callback
    	QObject::connect(aButtonQuit, SIGNAL(clicked()), this, SLOT(quit()));
     
    	connect(aButtonConvert,SIGNAL(clicked()), this, SLOT(euroChanged(4)));
     
    };
    L'erreur que je trouve est :

    Object::connect: No such slot Converter::quit()
    Object::connect: No such slot Converter::euroChanged(4)

    Merci d'avance.

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tout d'abord chacun des éléments de ton layout doit avoir un parent, sans quoi rien ne pourra s'afficher.

    Ensuitez, est-ce que tu as un slot quit() dans Converter ?
    Sinon le deuxième signal n'est pas utilisable, je te propose de lire mon tutoriel à ce sjet : http://matthieu-brucher.developpez.c...t/signal-slot/ Le signal soit avoir le même nombre d'argument que le slot et ce dernier ne peut pas avoir d'argument additionnel.

  9. #9
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut
    Salut !

    J'ai lu ton tutoriel mais cela ne m'a pas servi pour resoudre le problème... Désolé...
    Ajouter un parent, qu'est ce que tu veux dire quand tu dis ajouter un parent ? comment on fait ça ? à quoi ça sert ?

    Dans le cas de la méthode quit() j'ai compris qu'il faut que je l'implemente quelque part...

    Mais dans le cas d'un slot avec un paramètre... je ne sais pas pourquoi ça ne marche pas...
    J'ai fait un slot sans paramètre et ça marche. Le code que j'ai implementé est le suivant :

    Ca marche ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Dans le constructeur
    connect(aButtonConvert,SIGNAL(clicked()), this, SLOT(tester()));
     
    //Slot
    void Converter::tester()
    {
    qDebug("helloooo");
    };
    Ca ne marche pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //Dans le constructeur
    QString aQstring = "BLABLA";
    connect(aButtonConvert,SIGNAL(clicked()), this, SLOT(tester2(aQstring)));
     
    //Slot
    void Converter::tester2(const QString & iString)
    {
    qDebug("helloooo2");
    };
    Pourquoi ?

    Merci de votre aide ...

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(aButtonConvert,SIGNAL(clicked()), this, SLOT(tester2(aQstring)));
    ne peut pas marcher, le signal et le slot doivent avoir le même nombre d'arguments, ce qui n'est pas le cas ici.

  11. #11
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut
    Ok, j'ai arrivé à resoudre mon pb ac ton explication...

    Merci de m'avoir aidé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/05/2014, 18h06
  2. Réponses: 11
    Dernier message: 05/08/2009, 12h30
  3. [ImageMagick] Header envoyé lors de la création d'une image
    Par KLiFF dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 25/10/2005, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo