Seite 1 von 1

DesignerPlugin

Verfasst: 4. Mai 2010 11:07
von AuE
Hi,

bin grade dabei mir ein eigenes Widget für den Designer zu schreiben.
Ich halte mich dabei an das Custom Widget Plugin Example(aus den Examples).

Allerdings knallt es bei mir noch ...


navigationdesignerplugin.cpp:83: error: expected constructor, destructor, or type conversion at end of input
make: *** [navigationdesignerplugin.o] Error 1
Das ist beim Q_EXPORTPlugin2()

Code: Alles auswählen

Q_EXPORT_PLUGIN2(NavigationWidget, NavigationDesignerPlugin)
proFile:

Code: Alles auswählen

TEMPLATE = lib
TARGET += $$qtLibraryTarget($$TARGET)
CONFIG += designer \
    plugin
QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/designer


HEADERS += navigationdesignerplugin.h \
   navigationwidget.h
SOURCES += navigationdesignerplugin.cpp \
    navigationwidget.cpp
FORMS += navigationwidget.ui
RESOURCES += resource.qrc

# install
target.path = $$[QT_INSTALL_PLUGINS]/designer
sources.files = $$SOURCES \
    $$HEADERS \
    *.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/designer/NavigationWidget

INSTALLS += target \
    sources

Die Klass:

Code: Alles auswählen


class NavigationDesignerPlugin : public QObject, public QDesignerCustomWidgetInterface
{
	Q_OBJECT
	Q_INTERFACES(QDesignerCustomWidgetInterface)

public:
    NavigationDesignerPlugin(QObject *parent = 0);
	/*
			Since we (need to) implement QDesignerCustomWidgetInterface we need to fill this with some code
so the QtDesigner can load the plugin.
	*/
    bool isContainer() const;
    bool isInitialized() const;
    QIcon icon() const;
    QString domXml() const;
    QString group() const;
    QString includeFile() const;
    QString name() const;
    QString toolTip() const;
    QString whatsThis() const;
    QWidget *createWidget(QWidget *parent);
    void initialize(QDesignerFormEditorInterface *core);

private:
    bool initialized;
};

Jemand von euch eine Idee????

Verfasst: 4. Mai 2010 11:23
von franzf
Zeig mal den kompletten Source deines navigationdesignerplugin.cpp, evtl. gibts da vor der Zeile 83 einen Fehler ;)

Verfasst: 4. Mai 2010 11:54
von AuE
Hier der Code:

Code: Alles auswählen

#include "navigationdesignerplugin.h"
#include "navigationwidget.h"


NavigationDesignerPlugin::NavigationDesignerPlugin(QObject *parent /*== NULL BY DEFAULT*/ )
{
	Q_UNUSED(parent) // right now we do not need this

	this->initialized = false; // we're not initialized here!!!
}

void NavigationDesignerPlugin::initialize(QDesignerFormEditorInterface *core)
{
	Q_UNUSED(core) // we don't need this

	if (initialized)
		return;
	this->initialized = true;
}

bool NavigationDesignerPlugin::isInitialized() const
{
	return this->initialized;
}

QWidget *NavigationDesignerPlugin::createWidget(QWidget *parent)
{
	return new NavigationWidget(parent); // right here we create an instance of the visible stuff and return the ptr to the new widget!
}

QString NavigationDesignerPlugin::name() const
{
	return "Navigation Widget";
}

QString NavigationDesignerPlugin::group() const
{
	return "Custom Controls";
}

QIcon NavigationDesignerPlugin::icon() const
{
	return QIcon(":/images/systray_active.ico");
}

QString NavigationDesignerPlugin::toolTip() const
{
    return "main navigation Widget";
}

QString NavigationDesignerPlugin::whatsThis() const
 {
     return "";
 }

bool NavigationDesignerPlugin::isContainer() const
{
	// The isContainer() function tells Qt Designer whether the widget is supposed to be used as a container for other widgets.
	//If not, Qt Designer will not allow the user to place widgets inside it.
    return true;
}
QString NavigationDesignerPlugin::domXml() const
 {
     return "<ui language=\"c++\">\n"
	    " <widget class=\"NavigationWidget\" name=\"navigationwidget\">\n"
	    "  <property name=\"geometry\">\n"
	    "   <rect>\n"
	    "    <x>0</x>\n"
	    "    <y>0</y>\n"
	    "    <width>100</width>\n"
	    "    <height>100</height>\n"
	    "   </rect>\n"
	    "  </property>\n"
	    " </widget>\n"
	    "</ui>\n";
 }

QString NavigationDesignerPlugin::includeFile() const
 {
     return "navigationwidget.h";
 }


Q_EXPORT_PLUGIN2(navigationdesignerplugin, NavigationDesignerPlugin)

Verfasst: 4. Mai 2010 12:00
von solarix
#include <QtGui>

Verfasst: 4. Mai 2010 12:05
von franzf
Dann noch bitte "navigationwidget.h"
Aber vllt. kannst du ja das ganze Projekt mal anhängen, wenns nicht zuviel Mühe macht.

Verfasst: 4. Mai 2010 12:09
von franzf
solarix hat geschrieben:#include <QtGui>
Argh, er findet wahrscheinlich einfach das Macro nicht - stimmt...
Aber da sollte ein #include <QtPlugin> reichen.

Verfasst: 4. Mai 2010 12:16
von solarix
Das kann sein.. ich nimm bei diesem Fehler immer QtGui (weil ich in den Plugins häufig viele andere Qt-Gui-Klassen benötige), aber vermutlich reicht auch eine kleinere Header.

Verfasst: 4. Mai 2010 12:32
von AuE
Ja sauber ;-)

Jetzt baut er das ganze!!! Thx so far!

Jetzt kann ich das Widget im Designer sehen, um es in den Creator zu legen habe ich mir nen symlink nach QTDIR/bin/designer gelegt!

Jetzt kann ich es auch im Creator nutzen.
Allerdings sieht es nicht so aus wie gewollt ;-) Es ist quasi leer. Und beim bauen findet er den Header nicht.

Wie umgeht man das am geschicktesten??

(Habe das jetzt ersmal via "INCLUDEPATH += /opt/qtsdk-2010.02/qt/examples/designer/NavigationWidget")

Verfasst: 4. Mai 2010 12:49
von franzf
Ist es denn nur leer in der Form im Designer? Oder auch nachher, wenn du es gebaut hast.

Verfasst: 4. Mai 2010 14:15
von AuE
Im "Designer" sieht es so aus wie es aussehen soll, im Designer vom Creator sehe ich nix.

Verfasst: 4. Mai 2010 14:25
von franzf
AuE hat geschrieben:Im "Designer" sieht es so aus wie es aussehen soll, im Designer vom Creator sehe ich nix.
Hihi :D
Das ist natürlich doof...
Creator neustarten? Ansonsten schaut das nach nem Bug aus. Denn der in den Creator eingebettete Designer sollte eigentlich genau das selbe machen können wie die Standalone-app.
Oder kann es sein, dass du verschiedene Qt-Installationen bzw. dein Plugin mehrfach unter verschiedenen Namen installiert hast?

Verfasst: 4. Mai 2010 15:26
von AuE
Ich denke mal das Problem ist das der Designer woanders liegt als der Creator!

Die Pfade sind auch unterschiedlich => Wenn ich den Designer starte dann hat dieser eine ganze Menge an Plugins drin (alles was unter QTDIR/qt/plugins/designer liegt. Der Creator hingegen hat nur die Sachen die unter QTDIR/bin/designer liegen


Weitere Frage:
# install
target.path = $$[QT_INSTALL_PLUGINS]/designer
sources.files = $$SOURCES \
$$HEADERS \
*.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/designer/NavigationWidget[/
Installiert ja nach .../examples/designer ...

Ist das so clever? Wo würdet ihr euch hin installieren?

[/quote]

Verfasst: 4. Mai 2010 16:22
von AuE
BTW: Jetzt geht das mit den ganzen Verweisen etc los.

Kann man es i-wie anstellen das man im PRO File sagt Qt+=NavigationWidget und er dann den Rest automatisch macht?