继上一个例子,C++进行逻辑控制,结合QML界面的效果。
定义QML界面上图形的颜色。
实现鼠标控制,单击鼠标时,清除界面的图形。
类定义修改如下:
#ifndef MYPICS_H
#define MYPICS_H
#include <QDeclarativeItem>
#include <QColor>
class myPics : public QDeclarativeItem
{
Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor)
public:
myPics(QDeclarativeItem *parent = 0);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
Q_INVOKABLE void clearChart();
QColor color()const;
void setColor(const QColor &color);
signals:
void chartCleared();
private:
QColor myColor;
};
#endif // MYPICS_H
上面Q_PROPERTY宏的作用是声明这个类的属性,只有使用这个宏声明的属性,才可以在QML里面访问,此处申明了color属性。
QML中调用C++方法借助了Qt元对象系统,使用Q_INVOKABLE来修饰需在QML中被调用的函数。
类实现如下:
#include "mypics.h"
#include <QPainter>
#include <QFile>
myPics::myPics(QDeclarativeItem *parent) :
QDeclarativeItem(parent)
{
setFlag(QGraphicsItem::ItemHasNoContents, false);
}
QColor myPics::color()const
{
return myColor;
}
void myPics::setColor(const QColor &color)
{
myColor = color;
}
void myPics::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
QPen pen(myColor,3);
painter->setPen(pen);
painter->setRenderHints(QPainter::Antialiasing,true);
painter->drawPie(boundingRect(),30 * 16,260 * 16);
}
void myPics::clearChart()
{
setColor(QColor(Qt::transparent));
update();
emit chartCleared();
}
qml文件如下:
import pictures 1.0
import QtQuick 1.0
Item {
width: 300
height: 200
MyPics{
id:pics
anchors.centerIn: parent
width:100
height:100
onChartCleared : console.log("the pictrue has been cleared");
color:"green"
}
MouseArea {
id: mouse_area1
x: 100
y: 50
width: 100
height: 100
onClicked: pics.clearChart()
}
}
Paint()函数中的pen的颜色属性myColor是由qml文件中的color传递过来的。
当点击选中区域时,调用pics.clearChart(),即调用myPics::clearChart()实现了图案的清除。清除的同时发射chartCleared()信号,传回qml文件,打印出"the pictrue has been cleared",很好地实现了C++和qml的交互。