Je lutte depuis un moment avec un numéro sur Qt.
Voici mon code:
hexbutton.h:
#ifndef HEXBUTTON_H
#define HEXBUTTON_H
#include <QPushButton>
#include <QWidget>
#include <QIcon>
class HexButton : public QPushButton
{
Q_OBJECT
public:
HexButton(QWidget *parent, QIcon &icon, int i, int j);
public slots:
void changeIcon();
};
#endif // HEXBUTTON_H
Hexbutton.cpp:
#include "hexbutton.h"
HexButton::HexButton(QWidget *parent, QIcon &icon, int i , int j) : QPushButton(parent){
//setFlat(true);
setIcon(icon);
setGeometry((i*40)+((j*40)/2), j*40, 40, 40);
}
void HexButton::changeIcon(){
setIcon(QIcon("/Users/jonathanbibas/Documents/Workspace Qt/Test/hexagon.gif"));
}
MyWindow.h:
#ifndef MYWINDOW_H
#define MYWINDOW_H
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLCDNumber>
#include <QSlider>
#include <QProgressBar>
#include "hexbutton.h"
class MyWindow : public QWidget
{
public:
MyWindow();
~MyWindow();
private:
HexButton * myButtons[11][11];
};
#endif // MYWINDOW_H
MyWindow.cpp:
#include "MyWindow.h"
#include <QColor>
#include <QIcon>
MyWindow::MyWindow() : QWidget() {
setFixedSize(740, 440);
QIcon icon = QIcon("/Users/jonathanbibas/Documents/Workspace Qt/Test/whitehexagon.png");
for(int i =0 ; i < 11 ; i ++){
for(int j =0 ; j < 11 ; j ++){
myButtons[i][j] = new HexButton(this, icon, i, j);
QObject::connect(myButtons[i][j], SIGNAL(clicked()), myButtons[i][j], SLOT(changeIcon()));
}
}
}
MyWindow::~MyWindow()
{
delete myButtons;
}
Et enfin, Main.cpp:
#include <QApplication>
#include "MyWindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWindow fenetre;
fenetre.show();
return app.exec();
}
Juste au cas où, voici le Test.pro
SOURCES += \
Main.cpp \
MyWindow.cpp \
hexbutton.cpp
HEADERS += \
MyWindow.h \
hexbutton.h
Et je reçois les 2 erreurs:
1) symbole (s) introuvable (s) pour l'architecture x86_64
2) collect2: ld a renvoyé 1 état de sortie
Cela dit aussi 121 fois (11 * 11):
Object :: connect: Aucun de ces emplacements QPushButton :: changeIcon () dans ../Test/MyWindow.cpp:19
et sur la sortie de compilation, il est écrit:
18:22:15: Running build steps for project Test...
18:22:15: Configuration unchanged, skipping qmake step.
18:22:15: Starting: "/usr/bin/make" -w
make: Entering directory `/Users/jonathanbibas/Documents/Workspace Qt/Test-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Debug'
g++ -c -pipe -g -gdwarf-2 -Arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -Wall -W -DQT_GUI_LIB -DQT_CORE_LIB -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/mkspecs/macx-g++ -I../Test -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/lib/QtCore.framework/Versions/4/Headers -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtCore -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/lib/QtGui.framework/Versions/4/Headers -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtGui -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/include -I. -I../Test -I. -F/Users/jonathanbibas/QtSDK/Desktop/Qt/4.8.0/gcc/lib -o hexbutton.o ../Test/hexbutton.cpp
g++ -headerpad_max_install_names -Arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -o Test.app/Contents/MacOS/Test Main.o MyWindow.o hexbutton.o moc_MyWindow.o -F/Users/jonathanbibas/QtSDK/Desktop/Qt/4.8.0/gcc/lib -L/Users/jonathanbibas/QtSDK/Desktop/Qt/4.8.0/gcc/lib -framework QtGui -framework QtCore
Undefined symbols for architecture x86_64:
"vtable for HexButton", referenced from:
HexButton::HexButton(QWidget*, QIcon&, int, int)in hexbutton.o
HexButton::HexButton(QWidget*, QIcon&, int, int)in hexbutton.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [Test.app/Contents/MacOS/Test] Error 1
make: Leaving directory `/Users/jonathanbibas/Documents/Workspace Qt/Test-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Debug'
18:22:20: The process "/usr/bin/make" exited with code 2.
Error while building project Test (target: Desktop)
When executing build step 'Make'
Apparemment, l'erreur vient de Q_OBJECT (nécessaire pour la définition des slots), mais il y a un problème avec mon code, pas avec mon compilateur (parce que j'ai des slots dans MainWindow, cela fonctionne bien).
Merci de votre aide!
Face au même problème
Je l'ai fait et a travaillé pour moi
ça compile bien.
J'ai la même erreur. J'avais un emplacement privé déclaré dans un fichier .h, mais je ne l'avais pas défini dans mon fichier cpp. J'ai supprimé mon emplacement inutilisé aux deux endroits et celui-ci a été compilé.
Cela m’est arrivé lors de la fusion de code Qt d’une plate-forme à une autre. Je viens de le résoudre, après de nombreux essais et erreurs, alors je le publie ici car mon problème était différent. Si vous fusionnez de nouveaux fichiers, vous ne pouvez pas simplement fusionner les fichiers et le fichier .Pro et vous attendre à ce qu'ils apparaissent dans Qt Creator pour la compilation. Notez que vos nouveaux fichiers ne sont pas réellement affichés dans le IDE sous vos dossiers. J'ai négligé cela et je ne faisais que regarder la structure des dossiers et le fichier .Pro. Une fois que j'ai ajouté manuellement tous les fichiers dans Qt, tout a été compilé correctement. Voici comment j'ai compris ceci:
CONFIG -= x86_64
corrige ce problème pour moi
Cela peut se produire lorsque vous avez oublié l'opérateur de classe lors de la définition de votre fonction.
Fichier H:
class Globals
{
public:
unsigned int myFunction();
};
Fichier CPP:
unsigned int Globals::myFunction(){return 3;}
J'ai trouvé la réponse enfin! (pour quiconque sera intéressé)
L'erreur est que je n'aurais pas dû étendre la classe QPushButton pour personnaliser mon bouton, mais plutôt créer ma propre classe HexButton étendant/héritant de la classe QWidget! Nous devons ajouter au bouton un QPushButton. exemple. Eh bien, il fait alors:
class HexButton : public QWidget
{
Q_OBJECT
public:
HexButton(QWidget *parent = 0);
public slots:
void changeIcon();
private:
QPushButton *button;
};
Normalement, cela se produit avec Qt à cause de votre système de construction - cela indique que vous ne compilez pas/ne liez pas dans le code généré par moc
Je suis à peu près sûr qu'il n'y a rien de mal avec votre code - donc l'erreur doit être dans certains paramètres de qt creator, ce que je ne peux pas vraiment aider car je ne l'ai pas beaucoup utilisé.
Si vous ne l'avez pas déjà fait, vous pouvez essayer d'ajouter une déclaration de destructeur vide explicite à hexbutton.hpp et une définition à hexbutton.cpp. Cela ne devrait pas être nécessaire, mais j'ai entendu dire que cela faisait une différence sur certains compilateurs/linkers insolites.
essayez de supprimer le fichier pro.user et de réimporter le projet avec n’importe quel kit qt 32bit.
Déplacez le slot changeIcon () dans la classe HexButton depuis la classe MyWindow.