网上教程很多,我只是保存自己编译成功的程序:
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;
}
}
}