Signal an DLL-Slot senden

Alles rund um die Programmierung mit Qt
Antworten
donstephano
Beiträge: 5
Registriert: 24. November 2009 21:50

Signal an DLL-Slot senden

Beitrag von donstephano »

Hallo erstmal,

bin noch Anfänger mit Qt und habe folgendes Problem.
Ich hab mir eine DLL mit einem Slot erstellt, diesen Slot möchte ich nun mit einem Signal aus meiner Application verbinden, jedoch bekomme ich immer die Meldung:

"Object::connect: No such slot QLibrary::setValue(int) in .\sim_gui.cpp:52".

In der DLL befindet sich auch ein Fenster, dieses lässt sich ohne Probleme anzeigen, also ist die DLL ja anscheinend korrekt geladen.
Ich denke der Fehler ensteht schon beim Exportieren der DLL oder beim connect.
Vll kann mir hier ja jemand helfen.
Würde mich auf jedenfall freuen :)

MfG don

Hier mein Code:
DLL:

Code: Alles auswählen

q_test.h

#include <QtGui>
#include <QWidget>
#include <QString>

class __declspec(dllexport) MyScreen : public QWidget
{

	Q_OBJECT

	public:
		MyScreen(QWidget *parent = 0);
		MyScreen(int);
	public slots:
		void setValue(int);
};




#include "qt_test.h"



void MyScreen::setValue( int v ){
	qDebug("\nWerte über Slots: %d",v);
}

MyScreen::MyScreen(QWidget *parent) : QWidget(parent){

	setWindowFlags(Qt::Dialog);
	setWindowModality(Qt::WindowModal);
	resize(400,400);
	setWindowTitle("Test Dll");
	show();
}


MyScreen::MyScreen(int){

	qDebug("\nDLL geladen ");
}



extern "C"{

		__declspec(dllexport) QWidget* initMenu()
		{
			MyScreen* showya;
			showya = new MyScreen;
			return showya;
			
		}
};
und die Application:
stelle hier mal nur den wichtigen Teil rein, valueSetter() ist als Signal deklariert.

Code: Alles auswählen

 #include <QtGui>
#include "sim_gui.h"
#include <QLibrary>

...................................

void sim_gui::valueSetter(int v){
	emit valueSetted(v); 
}


void sim_gui::load_dll()  // Der wichtige Teil zum laden der DLL
{
	typedef QWidget* (*MenuFunction)();
	QLibrary *qlib = new QLibrary("qt_test");

     

	

	if(qlib->load())
		{   
			
			MenuFunction test = (MenuFunction) qlib->resolve("initMenu");
			if(test) 
			test(); //aufruf konstruktor von test (DLL) - Fenster
			connect(this,SIGNAL(valueSetted(int)),qlib, SLOT(setValue(int)));

			
	}
}
Ich hoffe ich habe das richtig verstanden, dass qlib ein Zeiger auf die DLL Klasse ist?!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QLibrary ht ja auch keinen Slot setValue() sondern MyScreen.

/edit: Des weiteren ist __declspec(dllexport) nicht ganz korrekt - benutze Q_DECL_EXPORT/Q_DECL_IMPORT (Foren-Suche!)
Und warum muss die DLL überhaupt dynamisch geladen werden? Brauchst Du wirklich ein Plugin?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
donstephano
Beiträge: 5
Registriert: 24. November 2009 21:50

Beitrag von donstephano »

Christian81 hat geschrieben:QLibrary ht ja auch keinen Slot setValue() sondern MyScreen.

/edit: Des weiteren ist __declspec(dllexport) nicht ganz korrekt - benutze Q_DECL_EXPORT/Q_DECL_IMPORT (Foren-Suche!)
Und warum muss die DLL überhaupt dynamisch geladen werden? Brauchst Du wirklich ein Plugin?

Hallo,

ja ich brauche ein Plugin, dies ist nur ein Testprogramm. Später möchte ich ein Programm entwickeln, welches durch dll's frei erweiterbar ist, ohne etwas im Code zu ändern.
Zum Slot:
Dann ist meine Frage, wie verbinde ich das Signal aus der Application mit dem Slot aus der Klassse MyScreen, welche ich ja in die DLL exportiert habe? Bzw. wie gebe ich dies im connect() an?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

ja ich brauche ein Plugin
Wenn du ein Plugin brauchst, warum nimmst du denn eine Library und nicht ein Plugin?
http://doc.trolltech.com/4.5/qpluginloader.html#details
Bzw. wie gebe ich dies im connect() an?
Vermutlich wäre die Instanz von "MyScreen" ganz gut:

Code: Alles auswählen

QWidget *screen = test();
connect(this,SIGNAL(valueSetted(int)),screen, SLOT(setValue(int))); 
donstephano
Beiträge: 5
Registriert: 24. November 2009 21:50

Beitrag von donstephano »

solarix hat geschrieben:
ja ich brauche ein Plugin
Wenn du ein Plugin brauchst, warum nimmst du denn eine Library und nicht ein Plugin?
http://doc.trolltech.com/4.5/qpluginloader.html#details
Bzw. wie gebe ich dies im connect() an?
Vermutlich wäre die Instanz von "MyScreen" ganz gut:

Code: Alles auswählen

QWidget *screen = test();
connect(this,SIGNAL(valueSetted(int)),screen, SLOT(setValue(int))); 
+

Ich meinte natürlich Libraries.
Ja super, es hat geklappt, der Slot wird gefunden. Danke.


edit:

Code: Alles auswählen

   QLibrary *qlib = new QLibrary("qt_test"); 
Jetzt würde mich nur noch interessieren, was in qlib steht. Die Adresse der geladenen DLL ?
Antworten