Seite 1 von 1

None QObject Based C++ Klasse in QtScript einbinden

Verfasst: 22. Juli 2010 20:09
von Ritchie
Hallo Zusammen,

ich einige eigene Klassen erstellt, welche keinen Bezug zu QObject haben (auch nicht abgeleitet wird davon), möchte diese aber jetzt unter QTScript erreichen.

Z.B. eine Klasse für eine Art eigene Variablen (Tagnames, welche eine Verbindung zur einer Steuerung erstellen)

Ich will jetzt mein Programm QT-scriptfähig schreiben, damit ich die Flexibilität von Benutzer erstellten Scripts in mein Programm einfügen kann. Für Insider (sowas wie Intouch, WinCC oder iFix).

Derzeit habe ich nur das Problem, das ich über den Copy-Constructor stolpere und mir dieser an einigen Stellen in die Suppe spuckt.
Da meine Klasse nicht von der Basis-Klasse QObject abgeleitet wird, wird
mein eigener Copy-Constructor in der Form abgewiesen.

Code: Alles auswählen

class		Tagname 
{
	public:
                 .....
		Tagname(const		Tagname		&OldElement);
                 ...
}

Tagname::Tagname(const		Tagname		&OldElement)
{
	m_Name						= OldElement.m_Name;
	m_EventInfo				= OldElement.m_EventInfo;
	m_AccessPoint			= OldElement.m_AccessPoint;
	m_DataBlock				= OldElement.m_DataBlock;
	m_Address 					= OldElement.m_Address;
	m_BitNumber 			= OldElement.m_BitNumber;
	m_Unit 							= OldElement.m_Unit;
	m_Datatype				= OldElement.m_Datatype;
	m_TagGroup 				= OldElement.m_TagGroup;
	m_MinValue 				= OldElement.m_MinValue;
	m_MaxValue 				= OldElement.m_MaxValue;
	m_TextLink 				= OldElement.m_TextLink;
	m_RecordedFlag 		= OldElement.m_RecordedFlag;
	m_AlarmState 			= OldElement.m_AlarmState;
}
Wenn ich jetzt QObject als Basis Klasse verwendet, wie würde dann der Copy Constructor aussehen ?

Ebenso ein Interner Aufruf

Code: Alles auswählen

NewItem = new Tagname;
NewItem->setDOMDefinition(&docElement);						add( *NewItem)
Einige Member meiner Klasse (eigene andere Klasse) erstellt eine "Deep-Copy", da hier der Speicher der Variablen liegt.

Gibt es vielleicht irgendwo ein nützliches Beispiel. Ich hatte mir jedoch bereits alle Beispiel von QT angesehen und komme da nicht wirklich klar mir.


Gruss R.

P.S.: Ich arbeite mit KUbuntu 9.10

Verfasst: 22. Juli 2010 20:31
von upsala
Ich weis zwar nicht, was das mit Kubuntu zu tun haben soll. Aber das hier ist ein passender Einstieg http://doc.trolltech.com/latest/script-customclass.html

Verfasst: 22. Juli 2010 22:39
von Ritchie
>Ich weis zwar nicht, was das mit Kubuntu zu tun haben soll.
Schaden tut es auch nicht. War wegen einem evtl. Beispiel.

Danke für den Link.

Gruss R.

Verfasst: 26. Juli 2010 15:39
von Ritchie
Hallo Zusammen,

meine Klasse, welche ich nur auf Basis des oben angelegt Beispiel für meine Zwecke erstmal in kleinen Schritten umgeschrieben habe, gibt mir einen netten Fehler beim Compilieren, welche ich nicht finde.

Die Zeile:

Code: Alles auswählen

TagnameClass::TagnameClass(QScriptEngine *engine) : QObject(engine), QScriptClass(engine)
{
	qScriptRegisterMetaType<Tagname>(engine, toScriptValue, fromScriptValue);

	m_prototype = engine->newQObject(new TagnamePrototype(this),					// Install the execute function
																	QScriptEngine::QtOwnership,									// C++ is the owner of the objects
																	QScriptEngine::SkipMethodsInEnumeration		
																	| QScriptEngine::ExcludeSuperClassMethods
																	| QScriptEngine::ExcludeSuperClassProperties);

	QScriptValue global = engine->globalObject();
	m_prototype.setPrototype(global.property("Object").property("prototype"));

	m_constructor = engine->newFunction(construct);
	m_constructor.setData(qScriptValueFromValue(engine, this));
}
gibt jetzt den folgenden Fehler aus.

Code: Alles auswählen

source/TagnameClass.cpp:46: error: no matching function for call to 'qScriptRegisterMetaType(QScriptEngine*&, QScriptValue (&)(QScriptEngine*, Tagname&), void (&)(const QScriptValue&, Tagname&))'
für diese Zeile aus:

Code: Alles auswählen

	qScriptRegisterMetaType<Tagname>(engine, toScriptValue, fromScriptValue);
Nun ist "Tagname" kein Build-in Meta-type, hier scheint QT noch etwas zu fehlen.
Das Beispiel arbeitet, da QByteArray ein Build-in type ist, und der Makro dann korrekt arbeitet.

Hat jemand eine Idee oder ein anderes Beispiel, welches auf none Meta-Type Klassen basiert

Gruss R.

Verfasst: 26. Juli 2010 19:45
von upsala
Da fehlen Q_DECLARE_METATYPE(...)

Im Anhang ist ein Beispiel, welches (fast) funktioniert.

Verfasst: 26. Juli 2010 19:56
von Ritchie
Hi,

das Beispiel im link arbeitet korrekt. Hatte ich bereits compiliert und ausprobiert.

Habe auch wie im Beispiel an der gleichen Stelle:

Code: Alles auswählen

Q_DECLARE_METATYPE(Tagname*)
Q_DECLARE_METATYPE(TagnameClass*)
Edit:
Das Beispiel geht, weil QMetaType::QPoint vorhanden ist.

Ich müsste wohl irgendwie mit
http://doc.trolltech.com/4.5/qmetatype. ... erMetaType
arbeiten.

Gruss R.

Verfasst: 26. Juli 2010 20:09
von upsala
Q_DECLARE_METATYPE(Tagname) fehlt noch

Verfasst: 26. Juli 2010 20:11
von Ritchie
Q_DECLARE_METATYPE(Tagname)
Q_DECLARE_METATYPE(Tagname*)
Q_DECLARE_METATYPE(TagnameClass*)


gleiches Spiel

Verfasst: 26. Juli 2010 20:41
von upsala
Wenn QScriptEngine eingebunden ist, würde ich mal mehr Code zeigen.

Verfasst: 26. Juli 2010 20:55
von Ritchie
Ich mache besser erstmal ein kleines Testprogramm.

So wie es jetzt ist, geht das nicht.

Gruss R.

Verfasst: 26. Juli 2010 21:47
von Ritchie
So,

habe ein kleines Beispiel zusammengestellt. Es kommt beim Compilieren genau mein Fehler.

Ob das ganze so überhaupt arbeitet, weiss ich natürlich auch nicht. Es soll ja mein erster Versuch damit sein.

Danke vorab schon mal für die Hilfe (auch schon bis jetzt).

Gruss R.

Verfasst: 26. Juli 2010 22:09
von upsala

Code: Alles auswählen

QScriptValue TagnameClass::toScriptValue(QScriptEngine *eng, const Tagname  &Tag)
Das const fehlt bei dir.

Verfasst: 27. Juli 2010 18:53
von Ritchie
Danke,

habe den Wald vor lauter Bäumen nicht mehr gesehen.

Jetzt kann ich mich mit den eigentlichen Funktionen auseinandersetzen.

Gruss R.