Seite 1 von 1

[gelöst] QWT und Windows

Verfasst: 21. August 2006 17:29
von Isa
Hallo,

mir gelingt es leider immer noch nicht (hab schon verschiedene Forumsbeiträge gefunden) Qwt so einzubinden, so dass ich die Widgets im Qt Designer bzw. in Visual Studio selbst verwenden kann. Ich "builde" qwt in der Console wie im Install-File beschrieben, das funktioniert. Wenn ich aber qwtplugin.pro im Unterverzeichnis designer "builden" will, dann erhalte ich bei nmake folgenden Fehler:

Code: Alles auswählen

C:\Qt\qwt-20060130\designer>nmake

Microsoft (R) Program Maintenance Utility Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

        "C:\Programme\Microsoft Visual Studio 8\VC\BIN\nmake.exe" -f Makefile.Release

Microsoft (R) Program Maintenance Utility Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

        link /LIBPATH:"c:\Qt\4.1.4\lib" /NOLOGO /INCREMENTAL:NO /INCREMENTAL:NO /DLL /OUT:"plugins\d
esigner\qwt_designer_plugin.dll" @C:\DOKUME~1\Isabelle\LOKALE~1\Temp\nmB5.tmp
   Creating library plugins\designer\qwt_designer_plugin.lib and object plugins\designer\qwt_designe
r_plugin.exp
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: __thiscall QwtPlot::Qwt
Plot(class QWidget *)" (??0QwtPlot@@QAE@PAVQWidget@@@Z) referenced in function "public: virtual clas
s QWidget * __thiscall QwtDesignerPlugin::PlotInterface::createWidget(class QWidget *)" (?createWidg
et@PlotInterface@QwtDesignerPlugin@@UAEPAVQWidget@@PAV3@@Z)
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: __thiscall QwtAnalogClo
ck::QwtAnalogClock(class QWidget *)" (??0QwtAnalogClock@@QAE@PAVQWidget@@@Z) referenced in function
"public: virtual class QWidget * __thiscall QwtDesignerPlugin::AnalogClockInterface::createWidget(cl
ass QWidget *)" (?createWidget@AnalogClockInterface@QwtDesignerPlugin@@UAEPAVQWidget@@PAV3@@Z)
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: __thiscall QwtCompass::
QwtCompass(class QWidget *)" (??0QwtCompass@@QAE@PAVQWidget@@@Z) referenced in function "public: vir
tual class QWidget * __thiscall QwtDesignerPlugin::CompassInterface::createWidget(class QWidget *)"
(?createWidget@CompassInterface@QwtDesignerPlugin@@UAEPAVQWidget@@PAV3@@Z)
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: __thiscall QwtCounter::
QwtCounter(class QWidget *)" (??0QwtCounter@@QAE@PAVQWidget@@@Z) referenced in function "public: vir
tual class QWidget * __thiscall QwtDesignerPlugin::CounterInterface::createWidget(class QWidget *)"
(?createWidget@CounterInterface@QwtDesignerPlugin@@UAEPAVQWidget@@PAV3@@Z)
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: __thiscall QwtDial::Qwt
Dial(class QWidget *)" (??0QwtDial@@QAE@PAVQWidget@@@Z) referenced in function "public: virtual clas
s QWidget * __thiscall QwtDesignerPlugin::DialInterface::createWidget(class QWidget *)" (?createWidg
et@DialInterface@QwtDesignerPlugin@@UAEPAVQWidget@@PAV3@@Z)
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: __thiscall QwtKnob::Qwt
Knob(class QWidget *)" (??0QwtKnob@@QAE@PAVQWidget@@@Z) referenced in function "public: virtual clas
s QWidget * __thiscall QwtDesignerPlugin::KnobInterface::createWidget(class QWidget *)" (?createWidg
et@KnobInterface@QwtDesignerPlugin@@UAEPAVQWidget@@PAV3@@Z)
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: __thiscall QwtSlider::Q
wtSlider(class QWidget *,enum Qt::Orientation,enum QwtSlider::ScalePos,enum QwtSlider::BGSTYLE)" (??
0QwtSlider@@QAE@PAVQWidget@@W4Orientation@Qt@@W4ScalePos@0@W4BGSTYLE@0@@Z) referenced in function "p
ublic: virtual class QWidget * __thiscall QwtDesignerPlugin::SliderInterface::createWidget(class QWi
dget *)" (?createWidget@SliderInterface@QwtDesignerPlugin@@UAEPAVQWidget@@PAV3@@Z)
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: __thiscall QwtTextLabel
::QwtTextLabel(class QWidget *)" (??0QwtTextLabel@@QAE@PAVQWidget@@@Z) referenced in function "publi
c: virtual class QWidget * __thiscall QwtDesignerPlugin::TextLabelInterface::createWidget(class QWid
get *)" (?createWidget@TextLabelInterface@QwtDesignerPlugin@@UAEPAVQWidget@@PAV3@@Z)
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: __thiscall QwtThermo::Q
wtThermo(class QWidget *)" (??0QwtThermo@@QAE@PAVQWidget@@@Z) referenced in function "public: virtua
l class QWidget * __thiscall QwtDesignerPlugin::ThermoInterface::createWidget(class QWidget *)" (?cr
eateWidget@ThermoInterface@QwtDesignerPlugin@@UAEPAVQWidget@@PAV3@@Z)
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: __thiscall QwtWheel::Qw
tWheel(class QWidget *)" (??0QwtWheel@@QAE@PAVQWidget@@@Z) referenced in function "public: virtual c
lass QWidget * __thiscall QwtDesignerPlugin::WheelInterface::createWidget(class QWidget *)" (?create
Widget@WheelInterface@QwtDesignerPlugin@@UAEPAVQWidget@@PAV3@@Z)
qwt_designer_plugin.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObje
ct const QwtPlot::staticMetaObject" (?staticMetaObject@QwtPlot@@2UQMetaObject@@B)
qwt_designer_plugin.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObje
ct const QwtDial::staticMetaObject" (?staticMetaObject@QwtDial@@2UQMetaObject@@B)
plugins\designer\qwt_designer_plugin.dll : fatal error LNK1120: 12 unresolved externals
NMAKE : fatal error U1077: '"C:\Programme\Microsoft Visual Studio 8\VC\BIN\link.EXE"' : return code
'0x460'
Stop.
NMAKE : fatal error U1077: '"C:\Programme\Microsoft Visual Studio 8\VC\BIN\nmake.exe"' : return code
 '0x2'
Stop.
Wenn ich aber das pro-File in Visual Studio lade (also open solution from .pro file), dann kompiliert es, zumindest wenn der Configuration Type in den Project Properties als Static Library angegeben wird. Leider sind die Widgets dann aber immer noch nicht im Designer drin (in der console würde ich dann einfach nmake install aufrufen, aber das geht ja nicht). Die examples kann ich auch kompilieren, aber nicht ausführen, da wird dann gemeckert, dass ich doch bitte die qwt5.dll installieren soll. Irgendwas scheint da fürchterlich schief zu gehen und ich habe keine Ahnung, was.
Eine weitere Frage hab ich auch noch: Ich habe bereits einmal ein Plugin für den Desiger erstellt, das auch brav dort angezeigt wird. Wenn ich aber das .ui-File in Visual Studio öffnen will, dann kennt er das Plugin nicht. Wie bekomme ich solche Widgets denn auch in Visual Studio hinnein?

Danke schon mal für eure Hilfe,
Isa

P.S. Meine Daten: MS Visual Studio 2005
Qt 4.1.4
Qwt 5 (version vom 30.01.06)
BS Windows XP

Verfasst: 22. August 2006 10:45
von Isa
Hat denn keiner eine Idee? Ich bin inzwischen ein bißchen weitergekommen und habe die qwtplugin.pro (designer) um folgende Zeile erweitert:

Code: Alles auswählen

win32-msvc2005:LIBS += ../lib/qwt5.lib
Das hat die Anzahl der Fehler reduziert, aber zwei sind immer noch da:

Code: Alles auswählen

C:\Qwt\designer>nmake

Microsoft (R) Program Maintenance Utility Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

        qmake -win32 -o Makefile qwtplugin.pro
        "C:\Programme\Microsoft Visual Studio 8\VC\BIN\nmake.exe" -f Makefile.Release

Microsoft (R) Program Maintenance Utility Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

        link /LIBPATH:"c:\Qt\4.1.4\lib" /NOLOGO /INCREMENTAL:NO /INCREMENTAL:NO /DLL /OUT:"plugins\d
esigner\qwt_designer_plugin.dll" @C:\DOKUME~1\Isabelle\LOKALE~1\Temp\nmA.tmp
   Creating library plugins\designer\qwt_designer_plugin.lib and object plugins\designer\qwt_designe
r_plugin.exp
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: static struct QMetaObje
ct const QwtPlot::staticMetaObject" (?staticMetaObject@QwtPlot@@2UQMetaObject@@B) referenced in func
tion "class QwtPlot * __cdecl qobject_cast<class QwtPlot *>(class QObject *)" (??$qobject_cast@PAVQw
tPlot@@@@YAPAVQwtPlot@@PAVQObject@@@Z)
qwt_designer_plugin.obj : error LNK2019: unresolved external symbol "public: static struct QMetaObje
ct const QwtDial::staticMetaObject" (?staticMetaObject@QwtDial@@2UQMetaObject@@B) referenced in func
tion "class QwtDial * __cdecl qobject_cast<class QwtDial *>(class QObject *)" (??$qobject_cast@PAVQw
tDial@@@@YAPAVQwtDial@@PAVQObject@@@Z)
plugins\designer\qwt_designer_plugin.dll : fatal error LNK1120: 2 unresolved externals
NMAKE : fatal error U1077: '"C:\Programme\Microsoft Visual Studio 8\VC\BIN\link.EXE"' : return code
'0x460'
Stop.
NMAKE : fatal error U1077: '"C:\Programme\Microsoft Visual Studio 8\VC\BIN\nmake.exe"' : return code
 '0x2'
Stop.
Jemand eine Idee? Ich bin für jeden Vorschlag dankbar und habe kein Problem damit die .pro - Datei so lange umzuschreiben, bis es funktioniert!

Grüße,
Isa

Verfasst: 22. August 2006 11:48
von Christian81
staticMetaObject ... da fehlen in der lib zwei Funktionen, nämlich QwtDial::staticMetaObject() und QwtPlot::staticMetaObject(). Diese werden normalerweise von moc erzeugt und dann automatisch mit qmake eingebunden.

Verfasst: 22. August 2006 12:56
von Isa
Danke, so was ähnliches habe ich mir gedacht, aber was kann ich jetzt tun? Ich habe das generierte moc-file schon einmal gelöscht und dann neu erzeugen lassen, aber das hat auch nicht funktioniert. Soll ich eine ältere Version von Qwt benutzen, funktioniert die besser?

Grüße,
Isa

Verfasst: 22. August 2006 15:47
von Isa
Also, ich hab jetzt was herausgefunden, von dem ich mir aber nicht sicher bin, ob es hilfreich ist:

Die einzigen beiden Klassen / Objekte, die den Linkfehler verursachen sind QwtPlot und QwtDial. Jetzt habe ich versucht herauszufinden, worin der Unterschied zu den anderen Klassen besteht und habe in qwt_designer_plugin.cpp (wird in der .pro als Source aufgerufen) folgende Methode gefunden:

Code: Alles auswählen

QObject *TaskMenuFactory::createExtension(
    QObject *object, const QString &iid, QObject *parent) const
{
    if (iid == Q_TYPEID(QDesignerTaskMenuExtension))
    {
        if (QwtPlot *plot = qobject_cast<QwtPlot*>(object))
            return new TaskMenuExtension(plot, parent);
        if (QwtDial *dial = qobject_cast<QwtDial*>(object))
            return new TaskMenuExtension(dial, parent);
    }

    return QExtensionFactory::createExtension(object, iid, parent);
}
Hat jemand eine Idee, ob der Linkerfehler damit zusammenhängen kann, oder ist das völliger Blödsinn?

Grüße,
Isa

DEFINES += QWT_DLL

Verfasst: 22. August 2006 21:14
von Uwe
Entweder Qwt aus dem CVS nehmen, oder "DEFINES += QWT_DLL" in qwt_plugin.pro eintragen.

HTH,
Uwe

PS: Auch dieses Forum hat eine Suchfunktion: http://www.qtforum.de/forum/viewtopic.p ... hlight=qwt

Verfasst: 23. August 2006 09:58
von Isa
Hallo Uwe,

danke für deine Hilfe. Ich habe mir Qwt aus dem CVS geholt und es hat alles kompiliert. Nur leider werden die Widgets nicht im Designer angezeigt und ich kann die Beispiele nicht ausführen. Es erscheint eine Fehlermeldung, dass die qwt5.dll nicht gefunden wurde, obwohl ich den Pfad in LIB eingetragen hab. Was muss ich noch machen, dass das alles funktioniert?

Grüße,
Isa

Verfasst: 23. August 2006 10:05
von Christian81
Der Pfad muss nicht in LIB sondern in PATH. Oder eben ins gleiche Verzeichnis wie die exe

Verfasst: 23. August 2006 10:31
von Isa
Oh... okay und schon funktioniert es. :oops: Danke!

Dann bleibt nur noch die Frage, wie die Widgets im Designer / Visual Studio angezeigt werden können. Die dlls befinden sich eigentlich alle an der richtigen Stelle: Im Qt-Designer in C:\Qt\4.1.4\plugins\designer und für Visual Studio in C:\Programme\Trolltech\Qt VS Integration\plugins. Für den Designer habe ich das eigentlich nach Installationsanweisung (mit nmake install) und wie im Qt-Tutorial beschrieben gemacht. In dem Tutroial stand außerdem, dass man die Widgets auch in Visual Studio zur Verfügung hat, wenn die dlls in das entsprechende Verzeichnis kopiert werden. Ist das richtig, oder muss man noch etwas machen?

Grüße,
Isa

Verfasst: 24. August 2006 09:58
von Isa
So, ich habe meine Widgets jetzt in den Designer hineinbekommen. Dazu habe ich das .pro-File umgeschrieben:

Code: Alles auswählen

# -*- mode: sh -*- ###########################
# Qwt Widget Library
# Copyright (C) 1997   Josef Wilgen
# Copyright (C) 2002   Uwe Rathmann
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the Qwt License, Version 1.0
##############################################

# pro file for the Qwt designer plugin

CONFIG    += designer plugin debug_and_release
TEMPLATE        = lib
MOC_DIR         = moc
OBJECTS_DIR     = obj 
DESTDIR         = $$QT_BUILD_TREE/plugins/designer
INCLUDEPATH    += ../include 
DEFINES        += QWT_DLL
TARGET          = qwt_designer_plugin
RCC_DIR         = resources

win32-msvc2005:LIBS += ../lib/qwt5.lib

    CONFIG(debug, debug|release)
    {
        unix: TARGET = $$join(TARGET,,,_debug)
        else: TARGET = $$join(TARGET,,d)
    }

HEADERS  += qwt_designer_plugin.h
HEADERS  += qwt_designer_plotdialog.h
SOURCES  += qwt_designer_plugin.cpp
SOURCES  += qwt_designer_plotdialog.cpp
RESOURCES += qwt_designer_plugin.qrc

target.path = $$[QT_INSTALL_PLUGINS]/designer
sources.files = $$SOURCES $$HEADERS *.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/../projects/qwt_plugin
INSTALLS += target sources
Es funktioniert zumindest für Qt 4.1.4 und Visual Studio 2005. Trotzdem würde ich gerne noch wissen, wie man diese Plugins auch in Visual Studio einbinden kann. Danke für eure Hilfe,

Isa

Verfasst: 31. August 2006 00:10
von Volker
Ich hab vor kurzem auch mal QWT ausprobiert. Nachdem ich dank Uwe nun weiss, dass ich die CVS Version nehmen muss, damit es richtig übersetzt, stand ich jetzt auch gerade vor dem Problem, dass im Designer die Widgets nicht zu finden waren.

Dachte erst an ein makefile Problem weil Isa ja noch was an der Pro Datei ändern wollte. Aber das entscheidende war, dass die qwt.dll nicht über den Pfad zugreifbar war und das Plugin die qwt.dll lädt. Ist diese nicht auffindbar, geht natürlich auch nichts im Designer.

Im nachhinein kann man das aus Christian's Bemerkung zwar schlussfolgern, aber ich möchte es hier nochmal betonen, da ich's zuerst net gecheckt habe. Obwohl's ja eigentlich logisch ist.

Also qwt.dll über PATH Variable zugreifbar machen und qwt_designer_plugin.dll in das plugins/designer Verzeichnis von QT. Wie's mit den Manifest Dateien steht weiss ich net, ich hab sie mal mitkopiert.
So klappt's nun auch bei mir. Visual Studio Integration hab ich keine, da kann ich Dir Isa also net weiterhelfen.

Verfasst: 31. August 2006 08:42
von Isa
Also, falls es noch jemanden interessiert, ich habe die Plugins jetzt auch in Visual Studio drin. Das hab ich allerdings nicht selbst herausgefunden, sondern im englischen Qt-Forum gefunden.
Das Problem war zumindest bei mir, dass die Bibliotheken in der Integration von Trolltech älter waren als die, mit denen ich QWT gebuildet habe. Diese Bibliotheken befinden sich unter C:\Programme\Trolltech\Qt VS Integration\bin (es handlet sich dabei um die QtCore4, QtDesigner, QtDesignerComponents4, QtGui4 und QtXml4).
Man muss sie einfach mit den neueren Versionen aus C:\Qt\4.1.4\bin ersetzten. Die plugin-Bibliotheken, also die dlls die man in Visual Studio anzeigen möchte, müssen dann tatsächlich nur einfach in das Verzeichnis C:\Programme\Trolltech\Qt VS Integration\plugins kopiert werden. Und schon sind die neuen Widgets in Visual Studio.

Grüße,
Isa