Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QT快速和C++类的范围问题 我有一个我正在研究的项目,它将有望以C++语言作为控制台,与其他控制台和设备通信。 我的测试设置基于运行UDP通信的RaspBerry Pi,在正常的Qt应用程序中运行良好。 我已经尝试移植到Qt-Quick,并使用一个简单的QML-UI,但是如果我在main.cpp的早期声明子类,它将无法正确连接。 如果我在main.cpp main函数中声明它,那么我希望用于传输数据的子类函数存在范围问题。 接受建议/批评……我100%确信有一种正确的方法可以做到这一点,所以如果有人想指点我……我会欣喜若狂_C++_Qt_Udp_Qml - Fatal编程技术网

QT快速和C++类的范围问题 我有一个我正在研究的项目,它将有望以C++语言作为控制台,与其他控制台和设备通信。 我的测试设置基于运行UDP通信的RaspBerry Pi,在正常的Qt应用程序中运行良好。 我已经尝试移植到Qt-Quick,并使用一个简单的QML-UI,但是如果我在main.cpp的早期声明子类,它将无法正确连接。 如果我在main.cpp main函数中声明它,那么我希望用于传输数据的子类函数存在范围问题。 接受建议/批评……我100%确信有一种正确的方法可以做到这一点,所以如果有人想指点我……我会欣喜若狂

QT快速和C++类的范围问题 我有一个我正在研究的项目,它将有望以C++语言作为控制台,与其他控制台和设备通信。 我的测试设置基于运行UDP通信的RaspBerry Pi,在正常的Qt应用程序中运行良好。 我已经尝试移植到Qt-Quick,并使用一个简单的QML-UI,但是如果我在main.cpp的早期声明子类,它将无法正确连接。 如果我在main.cpp main函数中声明它,那么我希望用于传输数据的子类函数存在范围问题。 接受建议/批评……我100%确信有一种正确的方法可以做到这一点,所以如果有人想指点我……我会欣喜若狂,c++,qt,udp,qml,C++,Qt,Udp,Qml,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.poin

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();
}

上载的代码将运行,但不会更新main.cpp中y的值。正如在函数fetchValue中注释掉的那样。如果返回y;行被注释掉,则发生范围错误。我确信我在做一些愚蠢的事情,或者最多是笨拙的事情……我让它工作起来了……正如我所说,这是一个愚蠢/笨拙的错误。我将一行代码复制到Q_对象之前的区域,而不是在…oops之后。一旦我解决了这个问题,范围问题就神奇地消失了。今天我将戴上我的dunces帽子,但我的RasPi现在在QML中与Linux和Win7 UI对话……这样我就可以进入我项目的下一阶段了!:-