بسم الله الرحمن الرحيم اخي العزيز السلام علكم ورحمة الله وبركاته ان هذا المقال يتكون من شقين الأول للتعرف على معايير لغة ecmascript والثاني للربط بين ecmascript و Qt في حال انك اتقنت اساسيات javascript او jscript او حتى actionscript فبإمكانك الإنتقال الى الشق الثاني من المقال وانصحك بقراءة ملخص ecmascript لكي لاتجع مجالا لعدم الفهم وفي حال انك اردت تطبيق هذه اللغة فبإستطاعتك تحميل المحرر التعليمي من خلال هذا الرابط http://www.ecmascript.org/download.php ويتوفر على انظمة الوندوز واللينوكس وال mac . قبل ان نتعرف على ECMAScript فإنه من المنطق أن نعرف ماذا يعني scripting language ؟ لغة برمجة نصية تتحكم بالتطبيقات وغالبا ما يتم تسميتها بأسماء تختلف عن برامجها مثل actionscript وبرنامجه الفلاش وكلاهم مكتوبين بلغتين مختلفة وهي في الغالب تكون في يد المستخدم النهائي لكي يتحكم بشكل او بمخرجات البرنامج . الآن دعنا نرجع الى لغة ecmascript وهي لغة برمجة كائنية التوجه ،، ولقد برمجت في الأصل لتكون web script language لتقوم بتزويدها بآلية لتنشيط الويب وهذا مابدا جليا في لغات انبثقت منها مثل javascript(mozila) و jscript(microsoft) و actionscript(adobe) ولكن تطورت فيما بعد لتدخل في كل شيئ ولكن ضمن بيئتها او برنامجها وهي الآن تعتمد في محارفها على معايير unicode ابتداء من النسخة 2.1 وما تلاها من نسخ ،وهي لغة تنفذ عمليات حسابية ومعالجة ضمن بيئة عملها ( برنامجها) ففي actionscript مثل هي تنفذ ضمن بيئة الفلاش وكذلك في javascript هي تنفذ ضمن بيئة المتصفح fireFox فالفكرة هنا انه كيف بالإمكان ان تقوم بربط الكائنات من لغة برمجة أخرى مثلا c++(Qt) بلغة ecmascript . دعنا الآن نترك تقنية Qt على جانب ونعرف ماهي معايير لغة ecmascript التي جعلت البرامج الأخرى تنشد نحوها كلغة برمجة لبيئتها . في حال انك تعاملت مع لغات مثل javascript او غيرها ستكون مدركا لمذا التدافع على ecmascript كخيار أول لتطوير لغات برمجة لبيئات بحيث تصبح وسيلة تطوير هذا البرنامج او البيئة هي اللغة التي قمت انت بصناعتها بواسطة ecmascript التي هي بالنسبة لمبرمجي c++ ابن بار لها لأنها ببساطة تكتسب تعابيرها الرياضية والشرطية والتكرارية وووو من لغة c++ فلذلك دعنا نأخذ جولة على مابهذه اللغة : تعاريف : المتغيرات : وهي حاويات للقيم وتنطبق عليها نفس شروط التسمية التي تنطبق على c++ وتتأثر لحالة الحرف ولكن مايميزها هو انها لا تطلب منك تحدد نوع المتغير بل بإمكانك جعل متغير واحد يحوي قيم مختلفة ويمكنك اضافة قبلها الكلمة المفتاحية var في حال كان المتغير خاصا . القيم والأنواع: الأرقام وتشمل العشرية منها والصحيحة بالإضافة الى NaN وهو ماليس برقم والقيم البولينية و النصية التي اما ان تكون بين علامتي تنصيص ثنائية او بين علامتي تنصيص مفردة "" او ' ' واللاشيئ Null في حال انك لم تنشئ المتغير بالإضافة القيمة الغير المحددة undefined اي انه تم انشاء متغيره ولكن لم تحدد له قيمة والنوع هو Object وسوف نفرد له حديثا آخر وبالإضافة الى الأنواع السابقة هناك الدوال function و المصفوفات array وجميعها سوف نأتي على ذكرها . الكائنات : في ecmascript فإن الكائنات هي عبارة عن خواص ( متغيرات) و طرق(دوال) وسوف نأتي في تفصيلها اكثر. المعاملات : الفاصلة المنقطة ";" وتعني نهاية جملة برمجة وكن في ecmascript فليس هناك من داعي لوضعها المعاملات الرياضية : + للجمع و – للطرح و * للضرب و / للقسمة و % لباقي القسمة و ++ لإضافة واحد و – لإنقاص واحد المعاملات المحرفية : + للجمع بين نصين او نص ورقم و بالإضافة الى سلاسل الهروب . المعاملات الشرطية : هناك كلمات مفتاحية متعارفة لدى مبرمجي اللغات الأخرى الشرط if(){} و elseif(){} و else{} و لكنها تختلف عن ما عهدناه في لغة c++ ان عامل المقارنة == يختبر المساواة بين القيم بغض النظر عن الأنواع . فمثلا 12=="12" هذه القيمة true ولكن في حال انك كتبت 12=== "12" فإن هذه القيمة خاطئة فثلاث علامات = تعني المساواة المطلقة في النوع و القيمة بالإضافة الى المعاملات المنطقية || و && و ! . المتغيرات العامة والمحلية والثابتة المتغيرات الخاصة
Var m
M
N=12Function r(){N=0}R()Print(n);
N=12Function r(){Var N=0}R()Print(n);
Const m=12m=1print(m)الناتج = 12 .
f = function(p){print(p)}f("mohammed")
Function f(p){print(p)}f("mohammed")
a=[1,2,3,[1,2,3]]Print(a[1])Print(a[3][0])
Try{statement}Catch(errorvar){statement}
Function test(n){ Try{ If(n==0) throw "mohammed" } Catch(a){ Print(a); }}Test(0);
Switch(var){Case value1:Statements1BreakCase value2:Statements2BreakDefault:Statements3}
(condition)?value1:value2
l=12r=(l<10)?1:2print(r)
For(var=1;var<10;var++){statement}
While(condition){statement}
Do{statement}While(condition)
Mylabel:statementBreak mylabel
Typeof var
N=12Print(typeof N)
Function mohammed(a,n){This.age=aThis.name=nThis.printAll=function(){Print(a+"…"+n) }}
M=new mohammed (20,"mohammed")
Print(M.age)Print(M.name)M.printAll()
Var={a1:value1,a2:value2,a3:value3,……}
Print(Var.a)
With(object){statement}
Function mohammed(a,n){This.age=aThis.name=nThis.printAll=function(){Print(a+"…"+n) }}M=new mohammed (20,"mohammed")With(M){Print(age)Print(name)printAll()}
For( var , object){statement}
Function mohammed(a,n){This.age=aThis.name=nThis.printAll=function(){Print(a+"…"+n) }}M=new mohammed (20,"mohammed")For(z in M){Print(z)}
A=[10,20,30,40]For(m in A){Print m}
delete object
Function myClass(a,n){This.age=a;This.name=n;}myClass.prototype.printAll=function(){print(this.name+"::"+this.age)r=new myClass(20,"mohammed")r.printAll();
A=new Array(4,3,5,"rami")A.length // 4
Array.prototype.age=12A=new Array(1,2,3,4,5,6)Print(A.age())
new Function("var1","var2",…,"statement")
F=new Function("x","y","print(x*y)")F(2,4)
function F(){A=arguments.lengthtotal=0For(i=0;i<A;i++){total+=arguments[i]}Return total}Print(F(1,2,3,4,5,6,7,8,9,10,11,12))
QT+=script
#include< QtScript>
#include <QtGui>#include <QtScript>int main(int argc, char *argv[]){QApplication app(argc, argv);QScriptEngine engine;QScriptValue ecma=engine.evaluate("m=new String('alslam 3likom')");QLabel lab(ecma.toString());lab.show();return app.exec();}
m=new String('alslam 3likom')
#include <QtGui>#include <QtScript>int main(int argc, char *argv[]){QApplication app(argc, argv);QScriptEngine engine;QLabel *lab=new QLabel;QScriptValue mylab = engine.newQObject(lab);engine.globalObject().setProperty("lab", mylab);engine.evaluate("lab.text='alslam 3likom'");engine.evaluate("lab.show()");return app.exec();}
function myInterestingScriptFunction() { ... }myQObject.event.connect(myInterestingScriptFunction);
1. #include <QtGui>2. #include <QtScript>3. int main(int argc, char *argv[])4. {5. QApplication app(argc, argv);6. QScriptEngine engine;7. QPushButton *button=new QPushButton("Qt-ar.com");8. QLabel *lab=new QLabel("mohammed");9. QScriptValue mybutton=engine.newQObject(button);10. QScriptValue mylab=engine.newQObject(lab);11. engine.globalObject().setProperty("button", mybutton);12. engine.globalObject().setProperty("lab", mylab);13. engine.evaluate("function slot(){this.lab.text='alabdaly'}; button.clicked.connect(slot);");14. QVBoxLayout layout;15. layout.addWidget(lab);16. layout.addWidget(button);17. QWidget w;18. w.setLayout(&layout);19. w.show();20. return app.exec();21. }
myQObject.event.disconnect(myInterestingFunction);
myQObject.event.connect(obj, "fun");
myQObject.event.disconnect(obj, "fun");
myQObject.event("any");
bool qScriptConnect ( QObject * sender, const char * signal, const QScriptValue & receiver, const QScriptValue & function )
bool qScriptDisconnect ( QObject * sender, const char * signal, const QScriptValue & receiver, const QScriptValue & function )
1. #include <QtGui>2. #include <QtScript>3. int main(int argc, char *argv[])4. {5. QApplication app(argc, argv);6. QScriptEngine engine;7. QPushButton *button=new QPushButton("Qt-ar.com");8. QLabel *lab=new QLabel("mohammed");9. QScriptValue mybutton=engine.newQObject(button);10. QScriptValue mylab=engine.newQObject(lab);11. QScriptValue slot=engine.evaluate("slot=function(){this.text='alabdaly'};");12. qScriptConnect(button,SIGNAL(clicked()),mylab,slot);13. QVBoxLayout layout;14. layout.addWidget(lab);15. layout.addWidget(button);16. QWidget w;17. w.setLayout(&layout);18. w.show();19. return app.exec();20. }
1. #include <QtGui>2. #include <QtScript>3. int main(int argc, char *argv[])4. {5. QApplication app(argc, argv);6. QScriptEngine engine;7. QPushButton *button=new QPushButton("Qt-ar.com");8. button->setObjectName("button");9. QLabel *lab=new QLabel("mohammed");10. lab->setObjectName("lab");11. QVBoxLayout layout;12. layout.addWidget(lab);13. layout.addWidget(button);14. QWidget w;15. w.setLayout(&layout);16. //======================================17. QScriptValue myw=engine.newQObject(&w);18. engine.globalObject().setProperty("w", myw);19. engine.evaluate("w.button.text='mohammed';w.lab.text='qt-ar.com'");20. w.show();21. return app.exec();22. }
parent.findChild("anyname");parent.findChildren("RegExp");
var okButton = myDialog.findChild("okButton");if (okButton != null) {// do something with the OK button}var buttons = myDialog.findChildren(RegExp("button[0-9]+"));for (var i = 0; i < buttons.length; ++i) {// do something with buttons[i]}
bool QScriptValue::toBoolean()int QScriptValue::toInt32()uint QScriptValue::toUInt32()float float(QScriptValue::toNumber())double QScriptValue::toNumber()short short(QScriptValue::toInt32())ushort QScriptValue::toUInt16()char char(QScriptValue::toInt32())uchar unsigned char(QScriptValue::toInt32())qlonglong qlonglong(QScriptValue::toInteger())qulonglong qulonglong(QScriptValue::toInteger())QStringQScriptValue::toString()QDateTimeQScriptValue::toDateTime()QDateQScriptValue::toDateTime().date()QRegExpQScriptValue::toRegExp()QObject*QScriptValue::toQObject()QWidget*QScriptValue::toQObject()QVariantQScriptValue::toVariant()QCharاذا كان QscriptValue سلسلة نصية فإنه يأخذ الحرف الول منها .اما اذا كانت السلسلة النصية فارغة فإنه يرجع Qchar null او عندما تكون رقم فإالناتج يكون Qchar مبني من uicode .QStringListاذا كان QscriptValue عبارة عن مصفوفة فإنها ترجع QstringList وإلا فإنه يرسل QstringList فارغ .QVariantListاذا كان QscriptValue عبارة عن مصفوفة فإنها ترجع t QVarianList وإلا فإنه يرسل QVariantList فارغ . QVariantMapاذا كان QscriptValue عبارة عن كائن فإنها ترجع QVariantMap <key,value> وهو عبارة عن زوج من (propertyName, propertyValue.toVariant()) وبإمكانك استخدام الصف وبإمكانك ستخدام الفئة QScriptValueIterator للتجول في خصائص الصف .QObjectListاذا كان QscriptValue عبارة عن مصفوفة فإنها ترجع QObjectList وإلا فإنه يرسلList Qobject فارغ .QList<int>اذا كان QscriptValue عبارة عن مصفوفة فإنها ترجع <int>QList وإلا فإنه يرسل <int> QList فارغ .
void QScriptEngine::undefinedValue()bool QScriptValue(engine, value)int QScriptValue(engine, value)uint QScriptValue(engine, value)float QScriptValue(engine, value)double QScriptValue(engine, value)short QScriptValue(engine, value)ushort QScriptValue(engine, value)char QScriptValue(engine, value)uchar QScriptValue(engine, value)QStringQScriptValue(engine, value)qlonglong QScriptValue(engine, qsreal(value)). ملاحظة قد يؤدي ذا النوع من التحويل الى فقد بعض البيانات فمن المفضل تحويلها الى qsrealqulonglong QScriptValue(engine, qsreal(value)). ملاحظة قد يؤدي هذا النوع من التحويل الى فقد بعض البيانات فمن المفضل تحويلها الى qsreal .QCharQScriptValue(this, value.unicode())QDateTimeQScriptEngine::newDate(value)QDateQScriptEngine::newDate(value)QRegExpQScriptEngine::newRegExp(value)QObject*QScriptEngine::newQObject(value)QWidget*QScriptEngine::newQObject(value)QVariantQScriptEngine::newVariant(value)QStringListيتم انشاء مصفوفة داخل اللغة النصية وذلك بإستخدام الدالة QScriptEngine::newArray()QVariantListA new script array (created with QScriptEngine::newArray()), whose elements are created using QScriptEngine::newVariant() for each element of the list.QVariantMapA new script object (created with QScriptEngine::newObject()), whose properties are initialized according to the (key, value) pairs of the map.QObjectListA new script array (created with QScriptEngine::newArray()), whose elements are created using QScriptEngine::newQObject() for each element of the list.QList<int>A new script array (created with QScriptEngine::newArray()), whose elements are created using the QScriptValue(QScriptEngine *, int) constructor for each element of the list.
1. class MyObject : public QObject2. {3. Q_OBJECT4. public:5. MyObject( ... );6. void aNonScriptableFunction();7. public slots: // these functions (slots) will be available in QtScript8. void calculate( ... );9. void setEnabled( bool enabled );10. bool isEnabled() const;11. private:12. ....13. };
1. class MyObject : public QObject2. {3. Q_OBJECT4. public:5. Q_INVOKABLE void thisMethodIsInvokableInQtScript();6. void thisMethodIsNotInvokableInQtScript();7. ...8. };
var obj = new MyObject;obj.setEnabled( true );print( "obj is enabled: " + obj.isEnabled() );
var obj = new MyObject;obj.enabled = true;print( "obj is enabled: " + obj.enabled);
1. class MyObject : public QObject2. {3. Q_OBJECT4. // define the enabled property5. Q_PROPERTY( bool enabled WRITE setEnabled READ isEnabled )6. public:7. MyObject( ... );8. void aNonScriptableFunction();9. public slots: // these functions (slots) will be available in QtScript10. void calculate( ... );11. void setEnabled( bool enabled );12. bool isEnabled() const;13. private:14. ....15. };
var obj = new MyObject;obj.enabled = true;print( "obj is enabled: " + obj.enabled );
obj.enabled = true; = setEnabled(bool);obj.enabled=isEnabled();
Q_PROPERTY( bool enabled WRITE setEnabl
1. #include<QtGui>2. #include<QtScript>3. class A:public QLabel{4. Q_OBJECT5. Q_PROPERTY( bool plose WRITE setPlose)6. public:7. A(QWidget*parent=0);8. Q_INVOKABLE void setNumber(int r);9. public slots:10. void setPlose(bool plose);11. };12. 13. A::A(QWidget*parent):QLabel(parent){}14. 15. void A::setNumber(int r){16. setNum(r);17. }18. 19. void A::setPlose(bool setPlose){20. if(setPlose)showFullScreen ();21. else showNormal ();22. }23. 24. int main(int argc, char ** argv)25. {26. QApplication app( argc, argv );27. QScriptEngine engine;28. QScriptValue s=engine.newQObject(new A);29. engine.globalObject().setProperty("a",s);30. engine.evaluate("a.setNumber(12);a.plose=true");31. return app.exec();32. }
struct MyStruct {int x;int y;};
Q_DECLARE_METATYPE(MyStruct)
3- QScriptValue toScriptValue(QScriptEngine *engine, const MyStruct &s)4- {5- QScriptValue obj = engine->newObject();6- obj.setProperty("x", QScriptValue(engine, s.x));7- obj.setProperty("y", QScriptValue(engine, s.y));8- return obj;9- }10- void fromScriptValue(const QScriptValue &obj, MyStruct &s)11- {12- s.x = obj.property("x").toInt32();13- s.y = obj.property("y").toInt32();14- }
QScriptValue myObjectToScriptValue(QScriptEngine *engine, MyObject* const &in){ return engine->newQObject(in); }void myObjectFromScriptValue(const QScriptValue &object, MyObject* &out){ out = qobject_cast<MyObject*>(object.toQObject()); }
1. #include <QApplication>2. #include <QtScript> 3. //4. struct MyStruct{5. int x;6. int y;7. };8. Q_DECLARE_METATYPE(MyStruct)9. QScriptValue toScriptValue(QScriptEngine *engine, const MyStruct &s)10. {11. QScriptValue obj = engine->newObject();12. obj.setProperty("x", QScriptValue(engine, s.x));13. obj.setProperty("y", QScriptValue(engine, s.y));14. return obj;15. }16. void fromScriptValue(const QScriptValue &obj, MyStruct &s)17. {18. s.x = obj.property("x").toInt32();19. s.y = obj.property("y").toInt32();20. }21. int main(int argc, char ** argv)22. {23. QApplication app( argc, argv );24. QScriptEngine *engine=new QScriptEngine;25. qScriptRegisterMetaType(engine, toScriptValue, fromScriptValue);26. MyStruct s;27. QScriptValue a=qScriptValueFromValue(engine,s);28. return app.exec();29. }
QScriptValue getProperty(QScriptContext *ctx, QScriptEngine *eng){QString name = ctx->argument(0).toString();return ctx->thisObject().property(name);}
function add() {return arguments[0] + arguments[1];}
QScriptValue add(QScriptContext *ctx, QScriptEngine *eng){double a = ctx->argument(0).toNumber();double b = ctx->argument(1).toNumber();return QScriptValue(eng, a + b);}
function F(){A=arguments.lengthtotal=0For(i=0;i<A;i++){total+=arguments[i]}Return total}
QScriptValue add(QScriptContext *ctx, QScriptEngine *eng){if (ctx->argumentCount() != 2) return QScriptValue(eng, 0);double a = ctx->argument(0).toNumber();double b = ctx->argument(1).toNumber();return QScriptValue(eng, a + b);}
1. QScriptValue add(QScriptContext *ctx, QScriptEngine *eng)2. {3. if (ctx->argumentCount() != 2)4. return ctx->throwError("add() takes exactly two arguments");5. if (!ctx->argument(0).isNumber())6. return ctx->throwError(QScriptContext::TypeError,7. "add(): first argument is not a number");8. if (!ctx->argument(1).isNumber())9. return ctx->throwError(QScriptContext::TypeError,10. "add(): second argument is not a number");11. double a = ctx->argument(0).toNumber();12. double b = ctx->argument(1).toNumber();13. return QScriptValue(eng, a + b);14. }
1. function foo() {2. // Let bar() take care of this.3. print("calling bar() with " + arguments.length + "arguments");4. var result = return bar.apply(this, arguments);5. print("bar() returned" + result);6. return result;7. }
1. QScriptValue foo(QScriptContext *ctx, QScriptEngine *eng)2. {3. QScriptValue bar = eng->globalObject().property("bar");4. QScriptValue arguments = ctx->argumentsObject();5. qDebug() << "calling bar() with" << arguments.property("length").toInt32() << "arguments";6. QScriptValue result = bar.apply(ctx->thisObject(), arguments);7. qDebug() << "bar() returned" << result.toString();8. return result;9. }
Function mohammed(a,n){This.age=aThis.name=nThis.printAll=function(){Print(a+"…"+n) }}M=new mohammed (20,"mohammed")
1. QScriptValue Person_ctor(QScriptContext *ctx, QScriptEngine *eng)2. {3. QScriptValue object;4. if (ctx->isCalledAsConstructor()) {5. object = ctx->thisObject();6. } else {7. object = eng->newObject();8. object.setPrototype(ctx->callee().property("prototype"));9. }10. object.setProperty("name", ctx->argument(0));11. return object;12. }
1. QScriptValue rectifier(QScriptContext *ctx, QScriptEngine *eng)2. {3. QRectF magicRect = qscriptvalue_cast<QRectF>(ctx->callee().data());4. QRectF sourceRect = qscriptvalue_cast<QRectF>(ctx->argument(0));5. return eng->toScriptValue(sourceRect.intersected(magicRect));6. }7. ...8. QScriptValue fun = eng.newFunction(rectifier);9. QRectF magicRect = QRectF(10, 20, 30, 40);10. fun.setData(eng.toScriptValue(magicRect));11. eng.globalObject().setProperty("rectifier", fun);
1. QScriptEngine engine;2. engine.evaluate("function fullName() { return this.firstName + ' ' + this.lastName; }");3. engine.evaluate("somePerson = { firstName: 'John', lastName: 'Doe' }");4. QScriptValue global = engine.globalObject();5. QScriptValue fullName = global.property("fullName");6. QScriptValue who = global.property("somePerson");7. qDebug() << fullName.call(who).toString(); // "John Doe"8. engine.evaluate("function cube(x) { return x * x * x; }");9. QScriptValue cube = global.property("cube");10. QScriptValueList args;11. args << QScriptValue(&engine, 3);12. qDebug() << cube.call(QScriptValue(), args).toNumber(); // 27
1. QScriptValue myCompare(QScriptContext *ctx, QScriptEngine *eng)2. {3. double first = ctx->argument(0).toNumber();4. double second = ctx->argument(1).toNumber();5. int result;6. if (first == second)7. result = 0;8. else if (first < second)9. result = -1;10. else11. result = 1;12. return QScriptValue(eng, result);13. }14. QScriptEngine eng;15. QScriptValue comparefn = eng.newFunction(myCompare);16. QScriptValue array = eng.evaluate("new Array(10, 5, 20, 15, 30)");17. array.property("sort").call(array, QScriptValueList() << comparefn);18. // prints "5,10,15,20,30"19. qDebug() << array.toString();
1- QScriptContext *ctx = eng.pushContext();2- QScriptValue act = ctx->activationObject();3- act.setProperty("digit", QScriptValue(&eng, 7));4- qDebug() << eng.evaluate("digit + 1").toNumber(); // 85- eng.popContext();
1. class MyScriptableObject: public QObject, QScriptable2. {3. Q_OBJECT4. ...5. public slots:6. void doSomething();7. double doSomethingElse();8. }9. void MyScriptableObject::doSomething()10. {11. context()->throwError("Threw an error from a slot");12. }13. double MyScriptableObject::doSomethingElse()14. {15. return qscriptvalue_cast<double>(thisObject());16. }
1. listWidget.addItem("Red");2. listWidget.addItem("Blue");3. listWidget.addItem("Green");4. listWidget.addItem("Cyan");5. listWidget.addItem("Yellow");6. listWidget.addItem("Purple");7. listWidget.addItems(["Orange", "Gray"]);8. listWidget.currentItemChanged.connect(9. function(item)10. {11. listWidget.setBackgroundColor(item.text);12. }13. );14. listWidget.show();
1. class ListWidgetItemPrototype : public QObject, public QScriptable2. {3. Q_OBJECT4. Q_PROPERTY(QString text READ text WRITE setText)5. public:6. ListWidgetItemPrototype(QObject *parent = 0);7. QString text() const;8. void setText(const QString &text);9. public slots:10. QString toString() const;11. };12. class ListWidgetPrototype : public QObject, public QScriptable13. {14. Q_OBJECT15. public:16. ListWidgetPrototype(QObject *parent = 0);17. public slots:18. void addItem(const QString &text);19. void addItems(const QStringList &texts);20. void setBackgroundColor(const QString &colorName);21. };
1. Q_DECLARE_METATYPE(QListWidgetItem*)2. Q_DECLARE_METATYPE(QListWidget*)3. ListWidgetItemPrototype::ListWidgetItemPrototype(QObject *parent)4. : QObject(parent){}5. QString ListWidgetItemPrototype::text() const6. {7. QListWidgetItem *item = qscriptvalue_cast<QListWidgetItem*>(thisObject());8. if (item)9. return item->text();10. return QString();11. }12. void ListWidgetItemPrototype::setText(const QString &text)13. {14. QListWidgetItem *item = qscriptvalue_cast<QListWidgetItem*>(thisObject());15. if (item)16. item->setText(text);17. }18. QString ListWidgetItemPrototype::toString() const19. {20. return QString("ListWidgetItem(text = %0)").arg(text());21. }22. ListWidgetPrototype::ListWidgetPrototype(QObject *parent)23. : QObject(parent)24. {25. }26. void ListWidgetPrototype::addItem(const QString &text)27. {28. QListWidget *widget = qscriptvalue_cast<QListWidget*>(thisObject());29. if (widget)30. widget->addItem(text);31. }32. void ListWidgetPrototype::addItems(const QStringList &texts)33. {34. QListWidget *widget = qscriptvalue_cast<QListWidget*>(thisObject());35. if (widget)36. widget->addItems(texts);37. }38. void ListWidgetPrototype::setBackgroundColor(const QString &colorName)39. {40. QListWidget *widget = qscriptvalue_cast<QListWidget*>(thisObject());41. if (widget) {42. QPalette palette = widget->palette();43. QColor color(colorName);44. palette.setBrush(QPalette::Base, color);45. widget->setPalette(palette);46. }47. }
1. int main(int argc, char **argv)2. {3. QApplication app(argc, argv);4. QScriptEngine engine;5. ListWidgetItemPrototype lwiProto;6. engine.setDefaultPrototype(qMetaTypeId<QListWidgetItem*>(),7. engine.newQObject(&lwiProto));8. ListWidgetPrototype lwProto;9. engine.setDefaultPrototype(qMetaTypeId<QListWidget*>(),10. engine.newQObject(&lwProto));11. QListWidget listWidget;12. engine.globalObject().setProperty("listWidget",13. engine.newQObject(&listWidget));14. QFile file(":/code.js");15. file.open(QIODevice::ReadOnly);16. QScriptValue result = engine.evaluate(file.readAll());17. file.close();18. if (engine.hasUncaughtException()) {19. int lineNo = engine.uncaughtExceptionLineNumber();20. qWarning() << "line" << lineNo << ":" << result.toString();21. }22. return app.exec();23. }