None QObject Based C++ Klasse in QtScript einbinden

Alles rund um die Programmierung mit Qt
Antworten
Ritchie
Beiträge: 86
Registriert: 29. Januar 2007 19:41

None QObject Based C++ Klasse in QtScript einbinden

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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
Ritchie
Beiträge: 86
Registriert: 29. Januar 2007 19:41

Beitrag 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.
Ritchie
Beiträge: 86
Registriert: 29. Januar 2007 19:41

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Da fehlen Q_DECLARE_METATYPE(...)

Im Anhang ist ein Beispiel, welches (fast) funktioniert.
Dateianhänge
test.tar.gz
(15.96 KiB) 212-mal heruntergeladen
Ritchie
Beiträge: 86
Registriert: 29. Januar 2007 19:41

Beitrag 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.
Zuletzt geändert von Ritchie am 26. Juli 2010 20:10, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Q_DECLARE_METATYPE(Tagname) fehlt noch
Ritchie
Beiträge: 86
Registriert: 29. Januar 2007 19:41

Beitrag von Ritchie »

Q_DECLARE_METATYPE(Tagname)
Q_DECLARE_METATYPE(Tagname*)
Q_DECLARE_METATYPE(TagnameClass*)


gleiches Spiel
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn QScriptEngine eingebunden ist, würde ich mal mehr Code zeigen.
Ritchie
Beiträge: 86
Registriert: 29. Januar 2007 19:41

Beitrag von Ritchie »

Ich mache besser erstmal ein kleines Testprogramm.

So wie es jetzt ist, geht das nicht.

Gruss R.
Ritchie
Beiträge: 86
Registriert: 29. Januar 2007 19:41

Beitrag 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.
Dateianhänge
MyFirstScriptClass.zip
(18.29 KiB) 223-mal heruntergeladen
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

QScriptValue TagnameClass::toScriptValue(QScriptEngine *eng, const Tagname  &Tag)
Das const fehlt bei dir.
Ritchie
Beiträge: 86
Registriert: 29. Januar 2007 19:41

Beitrag von Ritchie »

Danke,

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

Jetzt kann ich mich mit den eigentlichen Funktionen auseinandersetzen.

Gruss R.
Antworten