Qt:无法对类型为"QProcess::P rocessError"的参数进行排队 - QProcess::P rocessError(FailedToStart)

Qt: Cannot queue arguments of type 'QProcess::ProcessError' - QProcess::ProcessError(FailedToStart)

本文关键字:QProcess rocessError 排队 FailedToStart 参数 Qt 类型      更新时间:2023-10-16

我正在尝试将序列化图像传递给我在Qt程序中启动的进程。 但是,这样做时,我收到此错误消息:

QObject::connect: Cannot queue arguments of type 'QProcess::ProcessError'
(Make sure 'QProcess::ProcessError' is registered using qRegisterMetaType().)

我试图传递的图像是一个cv::Mat,我将其转换为QImage,然后转换为QString。

有人可以告诉我在将参数流式传输到变量参数时我做错了什么吗?我目前的猜测是问题在于图像的序列化形式,即它包含许多双引号,这就是为什么在下面的行中插入 matQStr 的值(将其流式传输到参数(时,存在误解

其他一切正常,只是现在尝试传递图像时出现问题。

如果您可能需要此信息,我正在启动的过程是一个使用 openCV 的 python 函数,该函数采用 1 个参数,即我尝试传递的图像。 序列化图像以将其传递给函数,显然是最简单的解决方案。

代码:

double myClass::runPythonScrypt()
{
cv::Mat imageParameter = cv::imread("/home/John/Desktop/image1.jpg", CV_LOAD_IMAGE_COLOR);
QImage img((uchar*)imageParameter.data, imageParameter.cols, imageParameter.rows, imageParameter.step1(), QImage::Format_RGB32);
std::string matStdString(imageParameter.begin<unsigned char>(), imageParameter.end<unsigned char>());
QString matQStr = QString::fromStdString(matStdString);
QProcess p;
QStringList params;
connect(&p, &QProcess::errorOccurred, qApp, &QApplication::aboutQt );
int a=55;
//I added "this is the end in the string because in the beginning I thought maybe some overflow occured and therefor not the entire image was passed to the process, yet you can see that this sentence gets printed"
params<< "-c" << "import cv2; import imp; foo = imp.load_source('myTest', '/home/John/fw/demos/myTest.py'); from myTest import myClass; myClassObj = myClass(); print myClassObj.myTestFunction( "+ matQStr +" ) this isthe end;";

qDebug()<<params;
p.start("python2", params);
if(! p.waitForFinished(-1))
{qDebug()<<"it failedddd";}
qDebug()<<"error that occured: "<<p.error();
QString errors = p.readAllStandardError();
qDebug()<<"occured errors:"<<errors;
QString p_stdout = p.readAllStandardOutput();

...
}

生成的输出:

started recognition thread
("-c", "import cv2; import imp; foo = imp.load_source('myTest', '/home/John/fw/demos/myTest.py'); from myTest import myClass; myClassObj = myClass(); print myClassObj.myTestFunction(
...etc...
����������������������Ѧ����<u0013u001Bu0014�������������������������������������������������������������������
����������������������������������������������������������������������u0011u0017u0005b=
*u0007u0005u0016=/"6=;<@@;;>AA@:311373//+1HcVFPsu007FeH?zu007FBY�f\�oJV��������������������t?
>K\`RJMTY`a[RSWQMJECBDDIEEEJKN
KJGJHF>@AGFHDC=<89:AA<0/4*%%+/../+##.657>9;=@BBBA@A@><:9<?@@?>?BB;;:88:;<>;;;>>=<;<@@>=<<<;:::;;<998:7337:;<;:
88955555677;;956:954578887879::8533146764441/./0110/--0563/1220./2665420/011222147;FEA>?>;8>=<BGG;04,,-%$&$ ")0
1./3332/,))++)),.)
etc...
10210.,,,-.-/12/*'',-023432-%#')')/04;94:<3.).51/1.((*.10,'1/23547702.0%#0+114; ) this isthe end;")
started recognition thread
QObject::connect: Cannot queue arguments of type 'QProcess::ProcessError'
(Make sure 'QProcess::ProcessError' is registered using qRegisterMetaType().)
it failedddd
error that occured:  QProcess::ProcessError(FailedToStart)
occured errors: ""
name:  ""
certitude:  0
return value:  0
2

编辑:

使用的 python 脚本:

#!/usr/bin/env python2
import cv2
import os
import numpy as np

class myClass:
def __init__(self): pass
def myTestfunction2(self):     
image= cv2.imread("/home/John/Desktop/image1.jpg")
cv2.imshow("image", image)
def myTestFunction(self, a):
print('my test function showing passed image as parameter')
cv2.imshow('a', a)        
cv2.waitKey(0)
return ('John', a)

请注意,这一行,用于流式传输参数而不是我软件中当前存在的参数,工作得很好:

params<< "-c" << "import cv2; import imp; foo = imp.load_source('myTest', '/home/John/fw/demos/myTest.py'); from myTest import myClass; myClassObj = myClass(); print myClassObj.myTestFunction(cv2.imread('/home/John/Desktop/image1.jpg'));";

但它并没有完全满足我的需要,我需要传递一个 cpp 变量而不是使用 cv2.imread((

我在您的代码中没有看到注册metaType行,所以请尝试:

QProcess p;
QStringList params;
qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError"); // new line
connect(&p, &QProcess::errorOccurred, qApp, &QApplication::aboutQt );

这应该解决

QObject::connect: Cannot queue arguments of type 'QProcess::ProcessError'
(Make sure 'QProcess::ProcessError' is registered using qRegisterMetaType().)

问题,所以您的连接将正常工作,您将看到大约Qt窗口,但如果由于某些原因QProcess无法启动,那么它仍然会有原始问题来源,所以 ^ 只是修复连接。

无论如何,QProcess在这里向您展示了问题的根源:

error that occured:  QProcess::ProcessError(FailedToStart)

很多时候,这意味着你试图使用一些错误的道路。请重新检查路径或尝试使用absolutePath,也许它会解决原始问题。

编辑:

好的,在您的评论之后很清楚,好吧,linux不能接受参数中的无限量数据,您尝试在此处编码非常大量的信息,请检查此链接 f.e.所以实际上你的第一种方法有正常的长度并且它有效,现在你传递了巨大的信息,你甚至没有运行python,是的,这是正确的路径,但系统只是拒绝它并向你显示QProcess::ProcessError(FailedToStart),当然,像... has too big argument或smth这样的信息可能会更方便,但我们没有。

总结:

所以你的方法不可能实现(不同的系统有不同的限制,所以看起来它甚至是危险的(不可移植的((,所以你需要重写你的应用程序。我只能建议尝试从Qt保存tmp文件tmp并将路径传递给脚本python就像上面的链接中建议的那样。

但是最好的方法可能是为C++/Qt编译OpenCV并直接在此处使用原始OpenCV代码,而无需tmp文件等,这将大大增加performance。与你的team谈论这个问题,如果它是一些任务,或者做as you wish,如果这是你的personal项目。