繁体   English   中英

如何使用Blackberry 10 Native方法生成条形图

[英]How to generate Bar Graph using Blackberry 10 Native method

我试图使用从Web服务获得的JSON数据生成条形图,基本上我的要求是使用“ JSON”数据显示“条形图”。

基本上,我是Android开发人员,而且是Blackberry 10 Native的新手,所以我对Blackberry的了解不多,因此,如果有人可以指导我有关在Blackberry-10中生成图形的信息。

我在Google以及我能找到的所有其他地方进行了很多搜索,但未得出任何结论。 我仍然在寻找解决方案,所以基本上我的“ JSON”数据采用以下格式。

{"Ax":"3:41","Ay":"04:41","Bx":"10:47 ","By":"12:47","Cx":"18:30","Cy":"19:30","Az":3,"Bz":2,"Cz":1,"condition":2}

在这里, "Ax":"3:41","Ay":"04:41"这是参数,表示开始和结束工作的小时数,最后像"Az":3,"Bz":2,"Cz":1一样计算小时总数"Az":3,"Bz":2,"Cz":1并据此生成图形。 所以类似地,我的图看起来像这样

http://postimg.org/image/nb6dnpwax/

请帮助我如何基于此生成图形,我引用生成图形的一些链接是

http://elycharts.com/examples
http://g.raphaeljs.com/
如何在C ++,Qt,QML,Blackberry 10 Cascades Beta 3 SDK中制作图表/图形(例如折线图,条形图,圆形图)等?
http://devblog.blackberry.com/2014/01/conference-app-secrets-part-3-json-vs-xml/

我要明确提到的一件事是,我想在Blackberry-10上使用qml和C ++方式解决方案,因此请不要建议任何其他方法,如Java和其他所有方法。

预先感谢您对我的帮助。

所以BlackBerry支持论坛上有这篇文章。 所有基本知识都在那里,但是我对运行时生成的图像做了很多工作,因此决定创建一个类来封装它。 根据要求,这里是一个基于Cascades模板的简单示例。 您还应该在以下位置熟悉文档:

以及BlackBerry GIT Hub上的示例文件。

QML文件:

/*
 * Copyright (c) 2011-2014 BlackBerry Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import bb.cascades 1.2

Page {
    Container {
        layout: DockLayout {

        }
        Label {
            // Localized text with the dynamic translation and locale updates support
            text: qsTr("Bar Graph") + Retranslate.onLocaleOrLanguageChanged
            textStyle.base: SystemDefaults.TextStyles.BigText
            horizontalAlignment: HorizontalAlignment.Center
        }
        ImageView {
            objectName: "barGraph"
            verticalAlignment: VerticalAlignment.Center
            horizontalAlignment: HorizontalAlignment.Center
        }
    }
}

这是头文件:

 /*
 * DrawableImage.hpp
 *
 *  Created on: Jul 11, 2014
 *      Author: richard
 */

#ifndef DRAWABLEIMAGE_HPP_
#define DRAWABLEIMAGE_HPP_

#include <bb/ImageData>
#include <QtGui/QImage>
#include <bb/cascades/ImageView>

namespace net
{
    namespace test
    {

        class DrawableImage : public QImage
        {
        public:
            DrawableImage();
            DrawableImage(QSize imageSize, QImage::Format format);
            virtual ~DrawableImage();

            void    emitRenderingBegin();
            void    emitRenderingFinished();

            DrawableImage&  operator = (const QImage &image) { QImage::operator =(image); return *this; }

            QPainter        &painter();

        public:
            void    updateToView(bb::cascades::ImageView *imageView);

        private:
                void    deleteBuffer();

                QPainter        m_painter;
                QSize           m_sizeInPixels;
                unsigned char*  m_buffer; // pixel data in PixelBufferData format
        };

    } /* namespace test */
} /* namespace net */

#endif /* DRAWABLEIMAGE_HPP_ */

和cpp文件:

/*
 * DrawableImage.cpp
 *
 *  Created on: Jul 11, 2014
 *      Author: richard
 */

#include <src/DrawableImage.hpp>

namespace net
{
    namespace test
    {

        DrawableImage::DrawableImage()
            : m_painter(), m_sizeInPixels(0,0), m_buffer(NULL)
        {
            // TODO Auto-generated constructor stub

        }

        DrawableImage::DrawableImage(QSize imageSize, QImage::Format format)
            : QImage(imageSize, format), m_painter(), m_sizeInPixels(0,0), m_buffer(NULL)
        {

        }


        DrawableImage::~DrawableImage() {
            // TODO Auto-generated destructor stub
        }

        /*
        void DrawableImage::emitRenderingBegin() {
            emit renderingBegin();
        }

        void DrawableImage::emitRenderingFinished() {
            emit renderingFinished();
        }
        */

        QPainter& DrawableImage::painter() {
            if (!m_painter.isActive()) {
                m_painter.begin(this);
            }

            return m_painter;
        }

        void DrawableImage::deleteBuffer()
        {
            if (m_buffer != 0)
            {
                delete [] m_buffer;
                m_buffer = 0;
            }
        }

        void    DrawableImage::updateToView(bb::cascades::ImageView *imageView) {
            if (m_painter.isActive()) {
                m_painter.end();
            }

            Q_ASSERT(imageView != NULL);

            QImage swapped     = rgbSwapped();
            QSize  swappedSize = swapped.size();

            int w = swappedSize.width();
            int h = swappedSize.height();

            int numBytes  = w * h * 4;
            if (swappedSize != m_sizeInPixels)
            {
                deleteBuffer();
                m_sizeInPixels = QSize(w, h);
                m_buffer = new uchar[numBytes];
            }

            // Copy the memory over.
            // We'll add defensive code in case rgbSwapped has a different size
            const uchar* from = swapped.constBits();
            int numFromBytes = swapped.numBytes();
            int numToCopy = std::min(numFromBytes, numBytes);

            memcpy(m_buffer, from, numToCopy);
            if (numToCopy < numBytes)
            {
                memset(m_buffer + numToCopy, 0x00, numBytes - numToCopy);
            }

            bb::ImageData imageData = bb::ImageData::fromPixels(m_buffer, bb::PixelFormat::RGBA_Premultiplied,
                                   m_sizeInPixels.width(),
                                   m_sizeInPixels.height(),
                                   m_sizeInPixels.width() * 4);

            imageView->setImage(imageData);
        }


    } /* namespace test */
} /* namespace net */

这是applicationui.cpp(未修改applicationui.hpp):

/*
 * Copyright (c) 2011-2014 BlackBerry Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "applicationui.hpp"

#include <bb/cascades/Application>
#include <bb/cascades/QmlDocument>
#include <bb/cascades/AbstractPane>
#include <bb/cascades/LocaleHandler>

#include <src/DrawableImage.hpp>

using namespace bb::cascades;
using namespace net::test;

ApplicationUI::ApplicationUI() :
        QObject()
{
    // prepare the localization
    m_pTranslator = new QTranslator(this);
    m_pLocaleHandler = new LocaleHandler(this);

    bool res = QObject::connect(m_pLocaleHandler, SIGNAL(systemLanguageChanged()), this, SLOT(onSystemLanguageChanged()));
    // This is only available in Debug builds
    Q_ASSERT(res);
    // Since the variable is not used in the app, this is added to avoid a
    // compiler warning
    Q_UNUSED(res);

    // initial load
    onSystemLanguageChanged();

    // Create scene document from main.qml asset, the parent is set
    // to ensure the document gets destroyed properly at shut down.
    QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);

    // Create root object for the UI
    AbstractPane *root = qml->createRootObject<AbstractPane>();

    /*
     * This code exercises the DrawableImage
     */
    QSize   graphImageSize(700, 700);
    DrawableImage    graph;
    ImageView* graphImageView = root->findChild<ImageView*>("barGraph");

    // Initialise graph and fill with transparent black.
        graph = QImage(graphImageSize, QImage::Format_ARGB32_Premultiplied);
        graph.fill(Qt::black);

        // Set the background mode
        graph.painter().setBackgroundMode(Qt::TransparentMode);

        // Set rendering hints
        graph.painter().setRenderHint(QPainter::Antialiasing, true);

        for (int i = 0; i < 10; i++) {

            int x = i * (graphImageSize.width()/10);
            int h = i * (graphImageSize.height()/10) + graphImageSize.height()/20;
            int w = graphImageSize.width()/10 - 20;

            graph.painter().fillRect( x + 10, graphImageSize.height()-h, w, h, Qt::darkGreen);
        }

    // Once the image is drawn transfer it to the Cascades ImageView
    graph.updateToView(graphImageView);

    // Set created root object as the application scene
    Application::instance()->setScene(root);
}

void ApplicationUI::onSystemLanguageChanged()
{
    QCoreApplication::instance()->removeTranslator(m_pTranslator);
    // Initiate, load and install the application translation files.
    QString locale_string = QLocale().name();
    QString file_name = QString("BarGraph_%1").arg(locale_string);
    if (m_pTranslator->load(file_name, "app/native/qm")) {
        QCoreApplication::instance()->installTranslator(m_pTranslator);
    }
}

您还需要在.pro文件中添加LIBS行:

APP_NAME = BarGraph

CONFIG += qt warn_on cascades10
LIBS += -lbb

include(config.pri)

结果如下:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM