您的位置:首页 > 编程语言 > Qt开发

从qtcreator的实例来简单分析qml的信号与响应函数

2014-08-21 09:36 337 查看
本人小白一枚,近日学习qt,发现很多东西都是从博客上学到,为了向大家分享自己学到的东西另外也可以自己温故知新,所以着手写博客,第一篇是自己今天搞明白的信号与函数,写的不好,大家见谅,以后会有后续的内容,将之前学到的东西做一个总结:本文代码来源于qt5.2.0 MinGW 32bit 所带的例子,名字是Qml Connecting to C++ Method and Signals:首先来看qml代码:
import Charts 1.0
import QtQuick 2.0
Item {
width: 300; height: 200
PieChart {
id: aPieChart
anchors.centerIn: parent
width: 100; height: 100
color: "red"
onChartCleared: console.log("The chart has been cleared")
}
MouseArea {
anchors.fill: parent
onClicked: aPieChart.clearChart()
}
Text {
anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter; bottomMargin: 20 }
text: "Click anywhere to clear the chart"
}
}
第一行import了 Chart 1.0,这个是由我们自己定义的,随之而来的是PieChart控件,也是有我们自己定义,然后通过main函数进行注册,这里主要讲信号与槽,就先不说注册的问题了。在PieChart控件中有onChartCleared这个消息,消息ChartCleard触发时相应console.log函数,同样在MouseArea控件中,有Clicked信号,对应我们自己定义的clearChart函数,下边转入信号的声明
//piechart.h
#ifndef PIECHART_H
#define PIECHART_H
#include <QtQuick/QQuickPaintedItem>
#include <QColor>
//![0]
class PieChart : public QQuickPaintedItem
{
//![0]
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(QColor color READ color WRITE setColor)
//![1]
public:
//![1]
PieChart(QQuickItem *parent = 0);
QString name() const;
void setName(const QString &name);
QColor color() const;
void setColor(const QColor &color);
void paint(QPainter *painter);
//![2]
Q_INVOKABLE void clearChart();
signals:
void chartCleared();
//![2]
private:
QString m_name;
QColor m_color;
//![3]
};
//![3]
#endif
可以看到信号的声明:signals:
void chartCleared();
因为是在PieChart里做的声明,所以在qml里调用的时候必须在PieChart控件里调用,其实到这里一个信号与函数基本上就算定义完成了,可是怎么调用呢,或者说怎么触发信号呢,因为在交互式的程序里都是按钮啊什么的,但是这里没有,就需要我们用到emit了,在qml程序里我们看到MouseArea里边的Onclick信号,这时又qt自己定义的,可以用来响应鼠标点击信号。当信号被触发时,clearChart函数被调用,此函数在piechart.h里声明Q_INVOKABLE void clearChart();
在piechart.cpp进行定义
//piechart.cpp
#include "piechart.h"
#include <QPainter>
PieChart::PieChart(QQuickItem *parent)
: QQuickPaintedItem(parent)
{
}
QString PieChart::name() const
{
return m_name;
}
void PieChart::setName(const QString &name)
{
m_name = name;
}
QColor PieChart::color() const
{
return m_color;
}
void PieChart::setColor(const QColor &color)
{
m_color = color;
}
void PieChart::paint(QPainter *painter)
{
QPen pen(m_color, 2);
painter->setPen(pen);
painter->setRenderHints(QPainter::Antialiasing, true);
painter->drawPie(boundingRect().adjusted(1, 1, -1, -1), 90 * 16, 290 * 16);
}
//![0]
void PieChart::clearChart()
{
setColor(QColor(Qt::transparent));
update();
emit chartCleared();
}
从函数定义void PieChart::clearChart()
{
setColor(QColor(Qt::transparent));
update();
emit chartCleared();
}
可以看出,当函数调用时,会执行emit,这时会便会触发chartClear信号,进而响应console.log函数。ok,就这样吧,下边附上main.cpp
#include "piechart.h"
#include <QtQuick/QQuickView>
#include <QGuiApplication>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<PieChart>("Charts", 1, 0, "PieChart");
QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///app.qml"));
view.show();
return app.exec();
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: