MeeGo 1.2 Harmattan Developer Documentation Develop for the Nokia N9

Chapter 2: Connecting to C++ Methods and Signals

Files:

Suppose we want PieChart to have a "clearChart()" method that erases the chart and then emits a "chartCleared" signal. Our app.qml would be able to call clearChart() and receive chartCleared() signals like this:

 import Charts 1.0
 import QtQuick 1.0

 Item {
     width: 300; height: 200

     PieChart {
         id: aPieChart
         anchors.centerIn: parent
         width: 100; height: 100
         color: "red"

         onChartCleared: console.log("The chart has been cleared")
     }

     MouseArea {
         anchors.fill: parent
         onClicked: aPieChart.clearChart()
     }

     Text {
         anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter; bottomMargin: 20 }
         text: "Click anywhere to clear the chart"
     }
 }

To do this, we add a clearChart() method and a chartCleared() signal to our C++ class:

 class PieChart : public QDeclarativeItem
 {
     ...
 public:
     ...
     Q_INVOKABLE void clearChart();

 signals:
     void chartCleared();
     ...
 };

The use of Q_INVOKABLE makes the clearChart() method available to the Qt Meta-Object system, and in turn, to QML. Note that it could have been declared as as a Qt slot instead of using Q_INVOKABLE, as slots are also callable from QML. Both of these approaches are valid.

The clearChart() method simply changes the color to Qt::transparent, repaints the chart, then emits the chartCleared() signal:

 void PieChart::clearChart()
 {
     setColor(QColor(Qt::transparent));
     update();

     emit chartCleared();
 }

Now when we run the application and click the window, the pie chart disappears, and the application outputs:

 The chart has been cleared

Try out the example yourself with the updated code in Qt's examples/tutorials/extending/chapter2-methods directory.