Chapter 2: Connecting to C++ Methods and Signals

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
    Q_INVOKABLE void clearChart();

    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()

    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.


© 2016 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.