在我的应用中,我以JPEG
格式从Android设备上通过QTcpSocket
作为字节数组接收图像。
当我在我的开发PC上运行这个应用程序时,它就像一个魅力(在调试和释放模式下)。但是,我无法从未安装Qt的另一台PC上的字节数组加载QImage
。
我在Qt中为我的平台(Windows x64,msvc_2015_64)包含了所有* .dll文件,并且还安装了Visual Studio C ++ Redistributable 2015.我的应用程序启动正常(没有出现任何错误,一些* .dll文件丢失)。但是QImage
一直都是空的。
首先我认为根本没有接收到字节数组,所以我检查了它的大小,发现它正在被正确接收。
我正在使用此代码从QImage
字节加载uchar
:
void handleImageBytes(uchar *bytes, qint64 length)
{
QImage image;
image.loadFromData(bytes, length, "JPEG");
emit frameReady(image);
}
我从QTcpSocket
收到这些字节:
void handleReadyRead()
{
if(this->incomingFrameLength==0){
QString data = this->client->readAll();
this->incomingFrameLength = data.toInt();
this->client->write("ok");
qDebug()<<QString("Received frame length: %1").arg(this->incomingFrameLength);
return;
}
if(this->incomingFrameLength!=0 && this->client->bytesAvailable()<this->incomingFrameLength)
return;
uchar* data = (uchar*)malloc(this->incomingFrameLength+256);
qint64 len = this->client->read((char*)data, this->incomingFrameLength+256);
qDebug() << QString("Received %1 bytes").arg(len);
handleImageBytes(data, len);
this->incomingFrameLength=0;
this->client->write("received");
qDebug()<<QString("Received frame of length %1").arg(len);
free(data);
}
如您所见,首先我收到图像的大小作为字节数组的长度。
然后我等待在QTcpSocket
的缓冲区中接收并准备好所有必需的字节。然后我创建指向具有足够大小的字节数组的指针,将传入的字节加载到该数组并从上面调用handleImageBytes
方法。
这一切在我的开发PC上运行正常(Windows 7 x64,Qt 5.7,msvc_2015_64)。 但是,当我将包含所有必需的* .dll文件的发布代码移动到未安装Qt的其他PC时,从字节数组加载图像不起作用。
如何解决这个问题?
答案 0 :(得分:0)
如果它在你的开发系统中工作,那么你可能仍然缺少一些DLL。不幸的是,Qt只会抱怨强制性的DLL,但还有其他的插件是可选的,只有当它们存在时(例如读取某些图像格式),某些功能才有可能,而不显示任何 DLL丢失错误。
将<QTDIR>\plugins\imageformats
文件夹(其中<QTDIR>
是Qt版本的安装路径,例如我的C:\Qt\qt_5_6_1\msvc2010
)复制到您的可执行文件所在的目录。请注意,调试和发布二进制文件混合在同一文件夹中,因此只需复制与构建配置相对应的文件。
您的项目目录应该类似于:
project\
project.exe
Qt5Core.dll
Qt5Gui.dll
...
imageformats\
qgif.dll
qico.dll
qjpeg.dll
...
Qt VS Add-on自动将一些目录添加到路径中,这就是从IDE运行时不会失败的原因。
注意:如果您想使用SVG图片,您还必须复制iconengines\qsvgicon.dll
和Qt5Svg.dll
。