QML 与 C++ 混合编程(2)

继上一个例子,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的交互。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值