QDBus 发送 int[]

Posted

技术标签:

【中文标题】QDBus 发送 int[]【英文标题】:QDBus send int[] 【发布时间】:2017-12-13 09:40:53 【问题描述】:

我目前开始使用 QDBus。我正在尝试将一个 int 数据数组发送到另一个程序,该程序将对数组进行一些计算,然后应该将其发送回来。

我尝试将数组起始地址作为 int 发送。 我相信这里的问题是我必须以某种方式发送值的副本,这样我的其他程序才不会最终试图弄乱不属于他的内存。

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

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

如您所见,我还尝试将我的值装箱到 QVariants 列表中,并尝试通过 callWithArgumentList 发送它,但我还没有找到一个关于如何编写将处理这些调用的签名的示例。

目前我导出他的插槽的类如下所示:

class Simulation : public QObject

    Q_OBJECT

public slots:
    Q_SCRIPTABLE int processLine(int dataPtr, int length);
;

和“processLine”是这样的:

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;

打印“现在应该开始打印像素值:”后崩溃。

所以我的主要问题是解决此问题的正确且最小的方法是什么(通过 dbus 发送 int[])?

您好, 罗宾

【问题讨论】:

为什么不直接发送std::vectorQVector? C 风格的数组在很多方面都很讨厌.. 我已经尝试过使用 QList 并且无法再调用“调用”,因为似乎缺少一些转换为 QVariant 的内容。但是要用矢量试试 同样的事情 iface.call 只接受 QVariant 作为参数传递给远程方法,遗憾的是没有可用于向量到 QVariant 的隐式转换 就我个人而言,我从来没有遇到过使用 Qt 通过 dbus 发送 QVector&lt;int&gt;std::vector&lt;int&gt; 的任何问题...但是,如果您只是错过了到 QVariant 的转换,那么您可以自己编写这样的代码- 虽然我不明白你为什么需要 - 它应该已经存在了。 int values[width][4]; 不是有效的 C++。 iface.call("processLine", (int)values, width); 将(通常)仅将 32 位数据传递给 processLine。您使用 QVariant 报告的问题来自缺少的包括(很可能您没有 #include &lt;QVariant&gt; 【参考方案1】:

当您从不熟悉的事物开始时,解决方案很可能非常简单。一件事是包含 QVariant

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

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

        
    

【讨论】:

以上是关于QDBus 发送 int[]的主要内容,如果未能解决你的问题,请参考以下文章

蓝牙问题使用 D-Bus (qdbus) 发送 AVRCP 卷更改发送与 org.bluez.MediaTransport1

启动后将 pid 映射到 qdbus 服务号

dbus-send to QDBus 程序示例

Photon RPC 发送错误的 int 值

使用 qdbus 连接到信号

如何在java中通过UDP发送一个int