Hallo,
ich habe ein eigenes Widget von QTableWidget abgeleitet. Es taucht auch im Designer auf. Wenn ich es jetzt allerdings in ein Projekt einbinde, kompiliert es nicht mehr. Hier die Fehlermeldung (unter "Build-Probleme"):
symbol(s) not found.
collect2: ld returned 1 exit status
und unter "Kompilierung":
ld: warning: directory '/tmp/qt-stuff-6474/source/qt-everywhere-opensource-src-4.7.0/lib' following -L not found
ld: warning: directory '/tmp/qt-stuff-6474/source/qt-everywhere-opensource-src-4.7.0/lib' following -F not found
Undefined symbols:
"MyTableWidget::MyTableWidget(QWidget*)", referenced from:
Ui_MyDialog::setupUi(QDialog*) in mydialog.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [myapp.app/Contents/MacOS/MyApp] Error 1
make: Leaving directory `/Users/klaus/MyApp-build-desktop'
Der Prozess "/usr/bin/make" wurde mit dem Rückgabewert %2 beendet.
Fehler beim Erstellen des Projekts MyApp(Ziel: Desktop)
Bei der Ausführung von Build-Schritt 'Make'
Erst gab es Probleme mit dem header meines Widgets, die hab ich aber gelöst (fand ihn nicht -> in INCLUDELIBS den Pfad eingebaut -> geht), aber jetzt hänge ich hier fest.
Nicht mal die einfachste Variante klappt. Hier der Code von meinem Widget (bei den plugin-dateien alles gelassen, so wie's automatisch erstellt wurde). Das Widget dann einfach in irgendein leeres Projekt ziehen und das dann kompilieren -> o.g. Fehler...
ich hab in dem Plugin aber nirgends einen Dialog....
Wie schon gesagt, in diesem Ui_MyDialog::setupUi() wird mein Widget mit new MyTableWidget erstellt...
hier auch noch der Code von meinem Plugin...
MyTableWidgetPlugin.h
Langsam gebe ich echt auf...
Wo auch immer es erstellt wird - bei der daraus resultierenden Library fehlt diese Funktion. Also musst Du schauen
- wo diese Funktion ist (wohl in der ui_wasauchimmer.h)
- ob sie mit kompiliert wird
- ob sie ggf. outdated ist.
Mit einem minimal kompilierbaren Beispiel könnte man ja mal schauen aber immer nur ein paar Brocken...
was willst du denn bitte mehr? du hast hier das komplette widget, das sich kompilieren lässt.
im designer -> neues projekt -> Benutzerdefiniertes Widget für QT Designer -> meinen Code nehmen
dann noch ein GUI, wo du NUR das Widget einbindest und dann kompilierst (und dann der kommt der fehler) brauch ich doch nicht geben, das sind 2 klicks im designer...
Es ist nicht die setupUi, die nicht gefunden wird, sondern MyTableWidget::MyTableWidget (welche in setupUi gebraucht wird).
Wenn du dir deine .cpp anschaust, weiß du auch warum :
MyTableWidget::RettungsmittelTableWidget() ist was GANZ anderes (kein Konstruktor, sondern eine normale Methode deiner Klasse)! Du hast wahrscheinlich dein Widget umbenannt, aber den Konstruktor vergessen...
"MyTableWidget::MyTableWidget(QWidget*)", referenced from:
Ui_MyDialog::setupUi(QDialog*) in mydialog.o
Der Designer ist glücklich, hat eine ui-Datei erstellt, aus der *.ui wurde eine *.h erzeugt welche sogar kompilierbar ist.
Beim Linken fehlt nun der CTor..
Also: AuE hat die Lösung schon lange geschrieben.
[EDIT]
Ich interpretiere "MyTableWidget::RettungsmittelTableWidget()" als einen Schreibfehler, weil 1. der Code im vollständigen Beispiel korrekt ist und 2. weil das gar nie kompiliert und klaus daher keinen Linkerfehler sondern einen Compilerfehler gehabt hätte.
Es ist nicht die setupUi, die nicht gefunden wird, sondern MyTableWidget::MyTableWidget (welche in setupUi gebraucht wird).
Wenn du dir deine .cpp anschaust, weiß du auch warum :
MyTableWidget::RettungsmittelTableWidget() ist was GANZ anderes (kein Konstruktor, sondern eine normale Methode deiner Klasse)! Du hast wahrscheinlich dein Widget umbenannt, aber den Konstruktor vergessen...
heißen (oben geändert, so wie's bei mir im Code ist)... Der Konstruktor ist also schon da... Ich hab hier im Forum die Klasse anders genannt als bei mir im Code und die Zeile vergessen zu ändern...
Die ganzen 'My's bringen einen total durcheinander.
Also was Du gebaut hast ist nur ein Plugin für den Designer. Was Du aber willst ist eine Shared Library gegen die Du linkst. Das sind eigentlich zwei verschiedene Dinge. Man kann es auch in einer Lib zusammenfassen (das was Du quasi schon hast) aber normalerweise macht man das nicht. Es gibt meist eine lib<Name>.so gegen die man linkt und eine lib<Name>_designer.so als Designer-Plugin.
Du hast also einfach vergessen gegen die Library zu linken.
danke, aber wie mach ich das? gibt's da irgendwo was, wo das einfach beschrieben wird, wie ich mir ein eigenes widget bastel? ich hab das beispiel vom assistant mit dieser analogworldtimeclock (oder so) verwendet.
bei mir wird nur diese "libmytablewidgetplugin.dylib" erstellt (OS X), die ich dann in den Designer-Ordner tu, um sie im Designer zu haben. Dann hab ich noch meinen INCLUDEPATH += /Users/klaus/RettungsmittelTableWidget zum header, mehr nicht...