Qt Quick和C ++类的范围问题

时间:2014-07-02 14:18:08

标签: c++ qt udp qml

我正在开发一个项目,希望能够生成带有QML UI作为控制台的C ++代码,与其他控制台和设备进行通信。 我的测试设置基于运行UDP通信的RaspBerry Pi(适用于普通的Qt应用程序)。 我试图移植到Qt Quick,并使用一个简单的QML UI,但如果我在我的" main.cpp"中提前声明子类。它没有正确连接。 如果我在main.cpp" main"中声明它函数,然后我有我想用来传输数据的子类函数的范围问题。 接受建议/评论......我完全肯定有一个"正确的"这样做的方式,所以如果有人想指出我......我会很高兴的!

Qt版本是Qt5.3。

import QtQuick 2.2
import QtQuick.Controls 1.1

Rectangle {
    width: 440; height: 150
    color: "orange"


    Column {
        anchors.fill: parent; spacing: 20

        Text {
            text: rootItem.theChange
            font.pointSize: 12; anchors.horizontalCenter: parent.horizontalCenter

        }
    }
}

// signalgrab.h
#ifndef SIGNALGRAB_H
#define SIGNALGRAB_H

#include <QObject>
#include <QUdpSocket>
#include <QString>

class SignalGrab : public QObject
{
    Q_OBJECT

    public:
    explicit SignalGrab(QObject *parent = 0);
    int SendValue();
    void setupUDP();

    signals:

    public slots:
    void readyRead();

    private:
    QUdpSocket *socket;
    QHostAddress groupAddress;
};

#endif // SIGNALGRAB_H

// signalgrab.cpp

#include "signalgrab.h"

int i3 = 0;

SignalGrab::SignalGrab(QObject *parent) :
    QObject(parent)

{
    // create a QUDP socket
    socket = new QUdpSocket(this);

    socket->bind(QHostAddress("0.0.0.0"), 45454);

    connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));

    qDebug() << "Socket connected ok!";
}

void SignalGrab::readyRead()
{
    // when data comes in
    QByteArray buffer;
    buffer.resize(socket->pendingDatagramSize());

    QHostAddress sender;
    quint16 senderPort;

    socket->readDatagram(buffer.data(), buffer.size(),
                         &sender, &senderPort);

    std::string s1 (buffer);
    std::string s2 = s1.substr(26,sizeof(s1));

    i3 = atoi(s2.data());

    SendValue();
}

int SignalGrab::SendValue()
{

    qDebug() << "sending i3 as:  "<< i3;
    return i3;
}

// main.cpp

#include <QtGui>
#include <QApplication>
#include <QQmlContext>
#include <QQuickView>

#include <QString>
#include "signalgrab.h"

int y=13;

// ///////////////////////////////////
//SignalGrab nc;
// ///////////////////////////////////

class Object : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString theChange READ getTheChange NOTIFY changeOfStatus)

public:
    Object()
    {
        changeMe = false;
        myTimer = new QTimer(this);
        myTimer->start(5000);
        connect(myTimer, SIGNAL(timeout()), this, SLOT(testSlot()));
    }

    QString getTheChange()
    {
        if (theValue == 0)
        {
            return "The Acid QML Test";
        }
        if (theValue == 1)
        {
            y = (fetchValue());

            qDebug() << "New y!" << y;
            return  QString("Returning %1").arg(y);
        }
        return "nothing has happened yet";
    }


    int fetchValue()
    {
        //  return (nc::SendValue());
        return y;
    }



    Q_INVOKABLE void someFunction(int i)
    {
        if ( i == 0) {
            theValue = 0;
        }
        if (i == 1) {
            theValue = 1;
        }
        emit changeOfStatus(i);
    }


signals:
    void changeOfStatus(int i) ;

public slots:
    void testSlot()
    {
        if (changeMe)
        {
            someFunction(0);
        } else {
            someFunction(1);
        }
        changeMe = !changeMe;
    }

private:
    bool changeMe;
    int theValue;
    QTimer *myTimer;
};


#include "main.moc"

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Object myObj;

    // //////////////////////////////
    SignalGrab nc;           //added
    // //////////////////////////////

    nc.SendValue();

    QQuickView view;
    view.rootContext()->setContextProperty("rootItem", (QObject *)&myObj);
    view.setSource(QUrl::fromLocalFile("main.qml"));
    view.show();

    return app.exec();
}

0 个答案:

没有答案