Viadeo Twitter Google Bookmarks ! Facebook Digg del.icio.us MySpace Yahoo MyWeb Blinklist Netvouz Reddit Simpy StumbleUpon Bookmarks Windows Live Favorites 
Logo Documentation Qt ·  Page d'accueil  ·  Toutes les classes  ·  Toutes les fonctions  ·  Vues d'ensemble  · 

Default Prototypes Example

Files:

This Qt Script example shows how to use default prototypes to make a non-QObject-based type scriptable.

With QScriptEngine::setDefaultPrototype() you can specify a QtScript object that defines a scripting interface for a C++ type; Qt Script operations on values of such types will then be delegated to your prototype object. In this example, a simple scripting interface for QListWidgetItem is defined, so that the text of items can easily be accessed from script code.

To define a scripting API for QListWidgetItem in terms of Qt properties and slots, we subclass QObject and QScriptable.

 class ListWidgetItemPrototype : public QObject, public QScriptable
 {
     Q_OBJECT
     Q_PROPERTY(QString text READ text WRITE setText)
 public:
     ListWidgetItemPrototype(QObject *parent = 0);

     QString text() const;
     void setText(const QString &text);

 public slots:
     QString toString() const;
 };

A single property, text, is defined, along with a slot, toString.

 ListWidgetItemPrototype::ListWidgetItemPrototype(QObject *parent)
     : QObject(parent)
 {
 }

 QString ListWidgetItemPrototype::text() const
 {
     QListWidgetItem *item = qscriptvalue_cast<QListWidgetItem*>(thisObject());
     if (item)
         return item->text();
     return QString();
 }

 void ListWidgetItemPrototype::setText(const QString &text)
 {
     QListWidgetItem *item = qscriptvalue_cast<QListWidgetItem*>(thisObject());
     if (item)
         item->setText(text);
 }

 QString ListWidgetItemPrototype::toString() const
 {
     return QString("ListWidgetItem(text = %0)").arg(text());
 }

The implementation of the property accessors use the qscriptvalue_cast() function to cast the script object to a QListWidgetItem pointer. The normal C++ QListWidgetItem API is then used to implement the desired functionality.

Although not shown here, it is possible to throw a script exception from a prototype function; for example, you could throw a TypeError exception if the qscriptvalue_cast() fails.

QListWidgetItems are usually added to a QListWidget. While QListWidget is a QObject-based class, not all the functionality needed for this example are present. We can solve this by creating a default prototype for the QListWidget class as well. The prototype will augment the functionality already provided by the Qt Script QObject integration; i.e. if a property or slot is not found in the QListWidget object itself, the prototype will be used as a fallback.

 class ListWidgetPrototype : public QObject, public QScriptable
 {
     Q_OBJECT
 public:
     ListWidgetPrototype(QObject *parent = 0);

 public slots:
     void addItem(const QString &text);
     void addItems(const QStringList &texts);
     void setBackgroundColor(const QString &colorName);
 };

The additional slots will make it possible to add items to a QListWidget from script code, and to set the background color of the widget from a string.

 ListWidgetPrototype::ListWidgetPrototype(QObject *parent)
     : QObject(parent)
 {
 }

 void ListWidgetPrototype::addItem(const QString &text)
 {
     QListWidget *widget = qscriptvalue_cast<QListWidget*>(thisObject());
     if (widget)
         widget->addItem(text);
 }

 void ListWidgetPrototype::addItems(const QStringList &texts)
 {
     QListWidget *widget = qscriptvalue_cast<QListWidget*>(thisObject());
     if (widget)
         widget->addItems(texts);
 }

 void ListWidgetPrototype::setBackgroundColor(const QString &colorName)
 {
     QListWidget *widget = qscriptvalue_cast<QListWidget*>(thisObject());
     if (widget) {
         QPalette palette = widget->palette();
         QColor color(colorName);
         palette.setBrush(QPalette::Base, color);
         widget->setPalette(palette);
     }
 }

Again, we use qscriptvalue_cast() to cast the script object to the relevant C++ type, in this case a QListWidget pointer. The addItem() and addItems() functions simply forward their arguments to the corresponding functions in the QListWidget class. setBackgroundColor() gets the widget's palette, creates a QColor from the given string argument and changes the palette accordingly.

 Q_DECLARE_METATYPE(QListWidgetItem*)
 Q_DECLARE_METATYPE(QListWidget*)

The relevant C++ types must be made known to Qt's meta type system.

     QScriptEngine engine;

     ListWidgetItemPrototype lwiProto;
     engine.setDefaultPrototype(qMetaTypeId<QListWidgetItem*>(),
                                engine.newQObject(&lwiProto));

     ListWidgetPrototype lwProto;
     engine.setDefaultPrototype(qMetaTypeId<QListWidget*>(),
                                engine.newQObject(&lwProto));

For each type that we want to associate a prototype object with, we create an instance of the prototype class, pass it to QScriptEngine::newQObject(), and then create the link between the C++ type and the resulting script object by calling QScriptEngine::setDefaultPrototype().

     QListWidget listWidget;
     engine.globalObject().setProperty("listWidget",
                                       engine.newQObject(&listWidget));

In this example, a single QListWidget object is added as a global script variable, called listWidget. Script code can add items to this widget by calling addItem() or addItems().

 listWidget.addItem("Red");
 listWidget.addItem("Blue");
 listWidget.addItem("Green");
 listWidget.addItem("Cyan");
 listWidget.addItem("Yellow");
 listWidget.addItem("Purple");
 listWidget.addItems(["Orange", "Gray"]);

Script code can connect to signals of the QListWidget object; signal handlers can use the interface defined in the QListWidgetItem prototype to manipulate item arguments.

 listWidget.currentItemChanged.connect(
     function(item)
     {
         listWidget.setBackgroundColor(item.text);
     }
 );

Not shown in this example is how to make QListWidgetItem constructible from Qt Script code, i.e. to be able to write "new QListWidgetItem()" in a script. In order to do this, you have to define your own script constructor for the type. The constructor would just be a factory function that constructs a new C++ QListWidgetItem and returns it back to the script. See QScriptEngine::newFunction() for more information.

Publicit�

Best Of

Actualit�s les plus lues

Semaine
Mois
Ann�e
  1. � Quelque chose ne va vraiment pas avec les d�veloppeurs "modernes" �, un d�veloppeur � "l'ancienne" critique la multiplication des biblioth�ques 53
  2. Les d�veloppeurs ignorent-ils trop les failles d�couvertes dans leur code ? Prenez-vous en compte les remarques des autres ? 17
  3. Apercevoir la troisi�me dimension ou l'utilisation multithread�e d'OpenGL dans Qt, un article des Qt Quarterly traduit par Guillaume Belz 0
  4. BlackBerry 10 : premi�res images du prochain OS de RIM qui devrait int�grer des widgets et des tuiles inspir�es de Windows Phone 0
  5. Quelles nouveaut�s de C++11 Visual C++ doit-il rapidement int�grer ? Donnez-nous votre avis 10
  6. Adieu qmake, bienvenue qbs : Qt Building Suite, un outil d�claratif et extensible pour la compilation de projets Qt 17
  7. La rubrique Qt a besoin de vous ! 1
Page suivante

Le Qt Developer Network au hasard

Logo

Livre blanc de l'outillage de Qt Quick

Le Qt Developer Network est un r�seau de d�veloppeurs Qt anglophone, o� ils peuvent partager leur exp�rience sur le framework. Lire l'article.

Communaut�

Ressources

Liens utiles

Contact

  • Vous souhaitez rejoindre la r�daction ou proposer un tutoriel, une traduction, une question... ? Postez dans le forum Contribuez ou contactez-nous par MP ou par email (voir en bas de page).

Qt dans le magazine

Cette page est une traduction d'une page de la documentation de Qt, �crite par Nokia Corporation and/or its subsidiary(-ies). Les �ventuels probl�mes r�sultant d'une mauvaise traduction ne sont pas imputables � Nokia. Qt 4.7
Copyright © 2012 Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'� 3 ans de prison et jusqu'� 300 000 E de dommages et int�r�ts. Cette page est d�pos�e � la SACD.
Vous avez d�nich� une erreur ? Un bug ? Une redirection cass�e ? Ou tout autre probl�me, quel qu'il soit ? Ou bien vous d�sirez participer � ce projet de traduction ? N'h�sitez pas � nous contacter ou par MP !
 
 
 
 
Partenaires

H�bergement Web