QML与C++混合编程

网上教程很多,我只是保存自己编译成功的程序:

colormaker.h

#ifndef COLORMAKER_H
#define COLORMAKER_H

#include <QObject>
#include <QColor>
#include <QTimerEvent>

class ColorMaker : public QObject
{
    Q_OBJECT
    Q_ENUMS(GENERATEALGORITHM) //qml中想使用枚举类型,这个宏将该枚举类型注册到yml元对象系统中
    /*
     * 定义可通过yml元对象系统访问的属性,通过他定义的属性,可以在qml中访问、修改,也可以在属性改变时发射特定的信号
     * 想要用这个宏,则c++类必须使用 Q_OBJECT的
    */
    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
    Q_PROPERTY(QColor timeColor READ timeColor)

public:
    explicit ColorMaker(QObject *parent = 0);

    enum GENERATEALGORITHM {
        RandomRGB,
        RandomRed,
        RandomGreen,
        RandomBlue,
        LinearIncrease,
    };

    QColor color() const;
    void setColor(const QColor& color);
    QColor timeColor() const;

    Q_INVOKABLE GENERATEALGORITHM algorithm() const; //被qml元对象系统调用
    Q_INVOKABLE void setAlgorithm(GENERATEALGORITHM algorithm);

signals:
    void colorChanged(const QColor& color);
    void currentTime(const QString& strTime);

public slots:
    void start();
    void stop();

protected:
    void timerEvent(QTimerEvent *event);

private:
    GENERATEALGORITHM m_algorithm;
    QColor m_currentColor;
    int m_nColorTimer;
};

#endif // COLORMAKER_H
colormaker.cpp

#include "colormaker.h"
#include <QDateTime>

ColorMaker::ColorMaker(QObject *parent)
    : QObject(parent)
    , m_algorithm(RandomRGB)
    , m_currentColor(Qt::black)
    , m_nColorTimer(0)
{
    qsrand(QDateTime::currentDateTime().toTime_t());
}

QColor ColorMaker::color() const
{
    return m_currentColor;
}

void ColorMaker::setColor(const QColor &color)
{
    m_currentColor = color;
    emit colorChanged(m_currentColor);
}

QColor ColorMaker::timeColor() const
{
    QTime time = QTime::currentTime();
    int r = time.hour();
    int g = time.minute() * 2;
    int b = time.second() * 4;
    return QColor::fromRgb(r, g, b);
}

ColorMaker::GENERATEALGORITHM ColorMaker::algorithm() const
{
    return m_algorithm;
}

void ColorMaker::setAlgorithm(ColorMaker::GENERATEALGORITHM algorithm)
{
    m_algorithm = algorithm;
}

void ColorMaker::start()
{
    if(m_nColorTimer == 0) {
        m_nColorTimer = startTimer(1000);
    }
}

void ColorMaker::stop()
{
    if(m_nColorTimer > 0) {
        killTimer(m_nColorTimer);
        m_nColorTimer = 0;
    }
}

void ColorMaker::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == m_nColorTimer) {
        switch (m_algorithm) {
        case RandomRGB:
            m_currentColor.setRgb(qrand() % 255, qrand() % 255, qrand() % 255);
            break;
        case RandomRed:
            m_currentColor.setRed(qrand() % 255);
            break;
        case RandomGreen:
            m_currentColor.setGreen(qrand() % 255);
            break;
        case RandomBlue:
            m_currentColor.setBlue(qrand() % 255);
            break;
        case LinearIncrease:
        {
            int r = m_currentColor.red() + 10;
            int g = m_currentColor.green() + 10;
            int b = m_currentColor.blue() + 10;
            m_currentColor.setRgb(r % 255, g % 255, b % 255);
        }
            break;
        default:
            break;
        }
        emit colorChanged(m_currentColor);
        emit currentTime(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
    } else {
        QObject::timerEvent(event);
    }
}
main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include "colormaker.h"
#include <QtQml>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<ColorMaker>("an.qt.ColorMaker", 1, 0, "ColorMaker");

    QQuickView viewer;
    QObject::connect(viewer.engine(),SIGNAL(quit()), &app, SLOT(quit()));
    viewer.setResizeMode(QQuickView::SizeRootObjectToView);
    viewer.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    viewer.show();

    return app.exec();
}
main.qml

import QtQuick 2.6
import QtQuick.Controls 1.2
import an.qt.ColorMaker 1.0

Rectangle {
    width: 360
    height: 360

    Text {
        id: timeLabel
        anchors.left: parent.left
        anchors.leftMargin: 4
        anchors.top: parent.top
        anchors.topMargin: 4
        font.pixelSize: 26
    }

    ColorMaker {
        id: colorMaker
        color: "green"
    }

    Rectangle {
        id: colorRect
        anchors.centerIn: parent
        width: 200
        height: 200
        color: "blue"
    }

    Button {
        id: start
        text: "start"
        anchors.left: parent.left
        anchors.leftMargin: 4
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 4
        onClicked: {
            colorMaker.start()
        }
    }

    Button {
        id: stop
        text: "stop"
        anchors.left: start.right
        anchors.leftMargin: 4
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 4
        onClicked: {
            colorMaker.stop()
        }
    }

    function changeAlgorithm(button, algorithm) {
        switch(algorithm) {
        case 0:
            button.text = "RandomRGB"
            break
        case 1:
            button.text = "RandomRed"
            break
        case 2:
            button.text = "RandomGreen"
            break
        case 3:
            button.text = "RandomBlue"
            break
        case 4:
            button.text = "LinearIncrease"
            break
        }
    }

    Button {
        id: colorAlgorithm
        text: "RandomRGB"
        anchors.left: stop.right
        anchors.leftMargin: 4
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 4
        onClicked: {
            var algorithm = (colorMaker.algorithm() + 1) % 5
            changeAlgorithm(colorAlgorithm, algorithm)
            colorMaker.setAlgorithm(algorithm)
        }
    }

    Button {
        id: quit
        text: "quit"
        anchors.left: colorAlgorithm.right
        anchors.leftMargin: 4
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 4
        onClicked: {
            Qt.quit()
        }
    }

    Component.onCompleted: {
        colorMaker.color = Qt.rgba(0, 180, 120, 255)
        colorMaker.setAlgorithm(colorMaker.LinearIncrease)
        changeAlgorithm(colorAlgorithm, colorMaker.algorithm())
    }

    Connections {
        target: colorMaker
        onCurrentTime: {
            timeLabel.text = strTime
            timeLabel.color = colorMaker.timeColor
        }
    }

    Connections {
        target: colorMaker
        onColorChanged: {
            colorRect.color = colorMaker.color;
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值