C++ QDBus发送int[]

C++ QDBus发送int[],c++,qt,dbus,C++,Qt,Dbus,我现在从QDBus开始。我正在尝试将一个int数组的数据发送到另一个程序,该程序将对数组进行一些计算,并应在之后将其发送回 我尝试将数组起始地址作为int发送。 我相信这里的问题是,我必须以某种方式发送一份值的副本,这样我的另一个prgoram就不会试图弄乱不是他的记忆 我当前正在获取此调试输出: sessionBus is connected... Starting line conversion... Done converting... Data at: -1077790240 Rep

我现在从QDBus开始。我正在尝试将一个int数组的数据发送到另一个程序,该程序将对数组进行一些计算,并应在之后将其发送回

我尝试将数组起始地址作为int发送。 我相信这里的问题是,我必须以某种方式发送一份值的副本,这样我的另一个prgoram就不会试图弄乱不是他的记忆

我当前正在获取此调试输出:

sessionBus is connected...
Starting line conversion...
Done converting...
Data at:  -1077790240 
Reply invalid:  Message recipient disconnected from message bus without replying 
Starting line conversion...
Done converting...
Data at:  -1077790240 
Reply invalid:  The name domain.comSim was not provided by any .service files 
Starting line conversion...
Done converting...
Data at:  -1077790240 
Reply invalid:  The name domain.comSim was not provided by any .service files
根据该代码:

void MainWindow::on_btnSend_clicked()
{
    if (!QDBusConnection::sessionBus().isConnected())
    {
        qDebug() << "Cannot connect to the D-Bus session bus.\r\n";

        return;
    }

    qDebug() << "sessionBus is connected...\r\n";

    QDBusInterface iface(SERVICE_NAME, "/", "", QDBusConnection::sessionBus());

    if (iface.isValid())
    {
        int height = this->image->height();
        int width = this->image->width();

        for(int lineCounter = 0; lineCounter < height; lineCounter++)
        {
            qDebug() << "Starting line conversion...\r\n";

            QRgb* lineValues = (QRgb*)this->image->scanLine(lineCounter);

            /*

            QList<QVariant> args;

            args << QVariant::fromValue(width);

            for(int pixelCounter = 0; pixelCounter < width; pixelCounter++)
            {
                args << QVariant::fromValue(qAlpha(lineValues[pixelCounter]));
                args << QVariant::fromValue(qRed(lineValues[pixelCounter]));
                args << QVariant::fromValue(qGreen(lineValues[pixelCounter]));
                args << QVariant::fromValue(qBlue(lineValues[pixelCounter]));
                ]
            }*/


            int values[width][4];

            for(int c = 0; c < width; c++)
            {
                values[c][0] = qAlpha(lineValues[c]);
                values[c][1] = qRed(lineValues[c]);
                values[c][2] = qGreen(lineValues[c]);
                values[c][3] = qBlue(lineValues[c]);
            }

            qDebug() << "Done converting...\r\n";
            qDebug() << "Data at: " << (int)values << "\r\n";

            QDBusReply<int> reply = iface.call("processLine", (int)values, width);

            if (!reply.isValid())
            {
                qDebug() << "Reply invalid: " << qPrintable(reply.error().message()) << "\r\n";
            }
        }
    }
    else
    {
        qDebug() << "Interface is invalid: " << qPrintable(QDBusConnection::sessionBus().lastError().message());
    }
}
和“processLine”如下所示:

class Simulation : public QObject
{
    Q_OBJECT

public slots:
    Q_SCRIPTABLE int processLine(int dataPtr, int length);
};
int Simulation::processLine(int dataPtr, int length)
{
    //int values[length][4];
    int** values = (int**)dataPtr;

    cout << "Data should be at: " << dataPtr << endl;

    cout << "Should start printing pixel values now:" << endl;

    for(int c = 0; c < length; c++)
    {
        cout << "Pixel #" << c << ": Alpha:" << values[c][0] << " Red:" << values[c][1] << " Green:" << values[c][2] << " Blue:" << values[c][3] << endl;
    }

    return dataPtr;
}
int-Simulation::processLine(int-dataPtr,int-length)
{
//整数值[长度][4];
int**值=(int**)数据ptr;

cout因为最有可能的情况是,当你开始做一些你不熟悉的事情时,解决方案非常简单

我现在能够使用以下代码传输所有数据:

 if (iface.isValid())
    {
        int height = this->image->height();
        int width = this->image->width();        

        QImage* recvImage = new QImage(width, height, QImage::Format_ARGB32);

        for(int lineCounter = 0; lineCounter < height; lineCounter++)
        {
            qDebug() << "Starting line conversion...\r\n";

            QRgb* lineValues = (QRgb*)this->image->scanLine(lineCounter);

            QList<int> values;

            for(int c = 0; c < width; c++)
            {
                values.append(lineValues[c]);
                //values.append(qAlpha(lineValues[c]));
                //values.append(qRed(lineValues[c]));
                //values.append(qGreen(lineValues[c]));
                //values.append(qBlue(lineValues[c]));
            }

            QVariant arg;
            arg.setValue(values);

            QDBusReply<QList<int> > reply = iface.call("processLine", arg);

            if (!reply.isValid())
            {
                qDebug() << "Reply invalid: " << qPrintable(reply.error().message()) << "\r\n";
            }

            QList<int> recvValues = reply.value();
            QRgb* recvLineValues = (QRgb*)recvImage->scanLine(lineCounter);

            for(int c = 0; c < width; c++)
            {
                //int alpha = recvValues.at(4*c);
                //int red = recvValues.at(4*c);
                //int green = recvValues.at(4*c);
                //int blue = recvValues.at(4*c);
                //recvLineValues[c] = qRgba(red, green, blue, alpha);
                recvLineValues[c] = recvValues.at(c);
            }

            QGraphicsScene* scene = new QGraphicsScene();
            QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(*(this->image)));

            scene->addItem(item);

            ui->gViewRecvImage->setScene(scene);
            ui->gViewRecvImage->show();

        }
    }
if(iface.isValid())
{
int height=此->图像->高度();
int width=this->image->width();
QImage*recvImage=新的QImage(宽度、高度、QImage::格式_ARGB32);
对于(int lineCounter=0;lineCounter扫描线(测线计数器);
QList值;
对于(int c=0;cgViewRecvImage->setScene(场景);
ui->gViewRecvImage->show();
}
}

为什么不发送一个
std::vector
QVector
?C样式的数组在很多方面都很糟糕..我试过使用QList,但无法调用“call”因为似乎缺少一些到QVariant的转换。但是要用VectorIface尝试同样的事情。call只接受QVariant作为参数传递到远程方法,遗憾的是,vector到QVariant没有隐式转换。我个人发送
QVector
std::v从来没有遇到过任何问题但是,如果你只是错过了一个转换到QVariant,那么你可以写这样的自己-虽然我困惑,为什么你需要-它应该已经存在。<代码> int值[宽度] [ 4 ];<代码>无效的C++。<代码> IFACE。调用(“PurrimeLINE”,(int)值,宽度);< /C> >(通常)仅将32位数据传递给processLine。使用QVariant报告的问题来自缺少的包含(很可能您没有
#include