A like-o-meter is used when a user shall rate content. In this case it’s a series of stars a user can give.
This time we begin with the desired output. Here is the a screenshot of the final example:
Defining the Star
We begin to sketch our star in a Star.qml file.
import Qt 4.6 Item { id: container width: 24 height: 24 property int rating property bool on signal clicked Image { id: starImage source: "images/star.png" x: 6 y: 7 opacity: 0.4 scale: 0.5 } MouseRegion { anchors.fill: container onClicked: { container.clicked() } } states: [ State { name: "on" when: container.on == true PropertyChanges { target: starImage opacity: 1 scale: 1 x: 1 y: 0 } } ] transitions: [ Transition { NumberAnimation { matchProperties: "opacity,scale,x,y" easing: "easeOutBounce" } } ] }
The star.png image looks like this:
The Star.qml component consist mainly of an Image element, the star.png file, which is displayed at 50% scale and 40% opacity.
The star changes when the property on
is set to true
. This is controlled by the state "on"
. It changes the opacity to 100% and scale to 100%, additional the position is adjusted. A transition makes the state switch smooth.
Using the Star
The Star.qml component is used inside the LikeOMeter.qml file.
import Qt 4.6 Item { id: container property int rating: 2 Row { Star { rating: 0 onClicked: { container.rating = rating } on: container.rating >= 0 } Star { rating: 1 onClicked: { container.rating = rating } on: container.rating >= 1 } Star { rating: 2 onClicked: { container.rating = rating } on: container.rating >= 2 } Star { rating: 3 onClicked: { container.rating = rating } on: container.rating >= 3 } Star { rating: 4 onClicked: { container.rating = rating } on: container.rating >= 4 } } }
The LikeOMeter consist of a row of stars. Each star’s on property
is set when the rating hits a specific threshold, which then results into painting the star image at 100% scale and 100% opacity based on the star "on" state
.
When the star’s mouse region is pressed the clicked signal is emitted and handled in the onClicked handler, in this case it’s updates the container rating property. Which is bound by the threshold to the on property
of the star again. So star clicked
leads to container rating
changes, leads to property on
evaluation, can lead to star "on"
state. Nice chain!
Using the LikeOMeter
You would use the LikeOMeter similar like this:
import Qt 4.6 Rectangle { id: container width: 200 height: 200 Column { anchors.centerIn: parent; spacing: 16 LikeOMeter { id: likeOMeter width: 150; height: 30 } Text { text: "Rating: " +likeOMeter.rating } } }
The Text is updated, when the rating changes. The rating changes, when a star is clicked. Sweet!
