[gelöst][Qt 4.1.1] Plugins mit qt-x11-opensource-src-4.1.1

Alles rund um die Programmierung mit Qt
Antworten
chronos
Beiträge: 34
Registriert: 20. September 2005 09:17
Kontaktdaten:

[gelöst][Qt 4.1.1] Plugins mit qt-x11-opensource-src-4.1.1

Beitrag von chronos »

Hallo Leute,

ich versuche gerade ein Programm zu schreiben das sich aus Plugins zusammenstöpseln lässt.
Leider lädt QT meine Plugins nicht.
Ich hab alles so gemacht wie im plug&paint example bschrieben.

Code: Alles auswählen

class PluginInterface{
public:
    virtual ~PluginInterface();
    virtual int run();

};

Q_DECLARE_INTERFACE(PluginInterface,"de.esf.esftools.plugininterface/1.0")
implementation des Plugins:

Code: Alles auswählen

class PL_yhinedit : public QObject , public PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
public:
	PL_yhinedit();
	int run(QWidget *parent);
	~PL_yhinedit();

};

PL_yhinedit::PL_yhinedit()
{
}


PL_yhinedit::~PL_yhinedit()
{
}

int PL_yhinedit::run(QWidget *parent)
{
	QWidget testwnd(parent);
	testwnd.resize( 100,100);
	testwnd.show();
	return 0;
}

Q_EXPORT_PLUGIN2(libyhin, PL_yhinedit)
In meiner projekt datei ist
CONFIG+=plugin
auch vorhanden.

Allerdings kann ich das plug&paint beispiel auch nicht ausführen, denn es findet keine plugins...... sieht so aus als würde da was anderes schief laufen nur was?
Muss ich einen besonderen schalter beim configure mit angeben damit plugins laufen?????

Hilfe ....
Zuletzt geändert von chronos am 23. März 2006 10:44, insgesamt 2-mal geändert.
chronos
Beiträge: 34
Registriert: 20. September 2005 09:17
Kontaktdaten:

Beitrag von chronos »

Hallo nochmal,
nachde ich rausgefunden habe, das ich die Qt-Bibliotheken nicht statisch linken darf hab ich sie nochmal neu übersetzt als dynamische Bibliotheken.
Allerdings ohne Erfolg. Also muss mir noch irgendwo ein Makro oder ein Compilerschalter fehlen ......
PS Die Definition und Deklaration der Klassen sind natürlich in .h und .cpp unterteilt ich habe sie nur zusammengeschrieben um nich soviele code tags aufmachen zu müssen.
Weis denn hier keiner eine Lösung?
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Ich bastle auch an sowas. Ich habe es so gebaut wie die ganzen Qt Treiber aufgebaut sind. Entweder wirfst du mal ein Blick in die Qt Quellen oder in mein Projekt (was aber noch lange nicht fertig ist)
svn co https://svn.sourceforge.net/svnroot/qsmartcard
chronos
Beiträge: 34
Registriert: 20. September 2005 09:17
Kontaktdaten:

Beitrag von chronos »

Hallo nochmal ich suche jetzt schon seit zwei Tagen. Deshalp poste ich jetzt mal meine gesamten sourcen. Vielleicht findet ja einer den Fehler:

esftools.cpp

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
	QApplication app(argc,argv);
	MainWindow wnd;
	wnd.show();
	return app.exec();
}
mainwindow.h

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QObject>
#include <QMessageBox>
#include <QDir>
#include <ui_mainwindow.h>
#include "plugininterface.h"

using namespace Ui;
class MainWindow : public QMainWindow, public UI_MainWindow
{
	Q_OBJECT
	public:
		MainWindow(QWidget *parent = NULL);
		bool eventFilter(QObject *obj, QEvent *event);
		~MainWindow();
	private:
		PluginInterface *pl;
		void loadPlugins();
	

};
mainwindow.cpp

Code: Alles auswählen

#include <QPluginLoader>
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
	this->setupUi(this);
	label->installEventFilter(this);
	this->pl = NULL;
	this->loadPlugins();
	
}


MainWindow::~MainWindow()
{
}

bool MainWindow::eventFilter( QObject * obj, QEvent * event )
{
	if (event->type() == QEvent::MouseButtonRelease)
	{
		if(qobject_cast<QLabel *>(obj))
		{
			QMessageBox::information(this,"Clicked","Klick mich nochmal",QMessageBox::Ok); 
			if(this->pl)
				pl->doit();
			else
				
				QMessageBox::information(this,"Doh","kein plugin geladen",QMessageBox::Ok); 
		}
	}
	return false;
}

void MainWindow::loadPlugins( )
{
	QDir pluginsDir = QDir(qApp->applicationDirPath());
	
	foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
		QMessageBox::information(this,"AHA",pluginsDir.absoluteFilePath(fileName),QMessageBox::Ok); 
		QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
		QObject *plugin = loader.instance();
		if (plugin != NULL) {
			QMessageBox::information(this,"AHA","plugin geladen",QMessageBox::Ok); 
			this->pl = qobject_cast<PluginInterface *>(plugin);
		}
	}
}
PluginInterface.h

Code: Alles auswählen

class PluginInterface
{
	public:
		virtual ~PluginInterface() {}
		virtual int doit() = 0;

};

Q_DECLARE_INTERFACE(PluginInterface,"de.plugintest.EsfTools.PluginInterface/1.0")
Project File:

Code: Alles auswählen

# Diese Datei wurde mit dem qmake-Manager von KDevelop erstellt. 
# ------------------------------------------- 
# Unterordner relativ zum Projektordner: ./src
# Das Target ist eine Anwendung:  ../bin/esftools

FORMS += mainwindow.ui 
IDLS += mainwindow.ui 
HEADERS += mainwindow.h \
           plugininterface.h 
SOURCES += esftools.cpp \
           mainwindow.cpp 
TARGET=../bin/esftools
Soweit zum PluginLoader
jetzt das Plugin

yhinplugin.h

Code: Alles auswählen

#include <QtCore>
#include <plugininterface.h>

class YhinPlugin : public QObject, public PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
public:
    YhinPlugin();
    int doit();
    ~YhinPlugin();

};
yhinplugin.cpp

Code: Alles auswählen

#include "yhinplugin.h"
#include <QWidget>

YhinPlugin::YhinPlugin()
{
}


YhinPlugin::~YhinPlugin()
{
}

int YhinPlugin::doit()
{
	QWidget *window = new QWidget(NULL);
	window->resize( 100,100);
	window->show();
	delete window;
	return 0;
}

Q_EXPORT_PLUGIN2(yhin,YhinPlugin);
und das pro file:

Code: Alles auswählen

# Diese Datei wurde mit dem qmake-Manager von KDevelop erstellt. 
# ------------------------------------------- 
# Unterordner relativ zum Projektordner: ./yhinplugin
# Das Target ist eine Bibliothek:  yhin

INCLUDEPATH += ../src 
TARGET = yhin 
DESTDIR = ../bin 
TEMPLATE = lib 
CONFIG += release \
          warn_on \
          plugin 
HEADERS += yhinplugin.h 
SOURCES += yhinplugin.cpp 
Die Qt Bibiliotheken sind dynmisch gelinkt und das plugandpaint example lässt sich auch richtig übersetzten also muss es was mit meinem Projekt zu tun haben.
Ach ja ich arbeite unter einem SuSE Linux 9.3 er System mit KDevelop
chronos
Beiträge: 34
Registriert: 20. September 2005 09:17
Kontaktdaten:

Beitrag von chronos »

AAAALso ich habs gefunden.
Anscheinend darf ich mein Projekt nicht im debug Modus erstllen.
Weil im PluginLoader eine Abfrage ist :

Code: Alles auswählen

#ifndef QT_NO_DEBUG_PLUGIN_CHECK
    } else if(debug != QLIBRARY_AS_DEBUG) {
        //don't issue a qWarning since we will hopefully find a non-debug? --Sam
#endif
    } else {
        pluginState = IsAPlugin;
    }

    return pluginState == IsAPlugin;
}
und wenn man nun beim debuggen ist wird das Plugin nicht geladen.....
Allerdings kann ich dann mein Progamm auch nicht debuggen oder hat jemand ähnliche erfahrungen gemacht oder weiss wie ich den Debug modus auch mit libraries aktivieren kann?

[edit]
Also anscheinend is da noch ein kleiner Bug im Kdevelop QMake Manager der anscheinend nicht immer das debug flag auch wirklich in das pro file reinschreibt. Jetzt wo beides (Library und Hauptprogramm) als Debug übersetzt werden klappts plötzlich (YEHAAAAAA)
[/edit]
Antworten