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