我正在使用Qt5在c ++中编写视频抓取应用程序。我正在关注他们的示例代码并查看获取相机信息的文档: http://doc.qt.io/qt-5/qcamerainfo.html
我遇到的问题是,在使用规定的技术获取相机数据(效果很好)之后:
QList<QCameraInfo>cameraInfos = QCameraInfo::availableCameras();
每当Access violation
超出范围时,我都会收到cameraInfos
错误。
例如,如果我这样做:
void readDeviceInfo(void) {
// Camera devices:
QList<QCameraInfo>cameraInfos = QCameraInfo::availableCameras()
for (QList<QCameraInfo>::Iterator it = cameraInfos.begin();
it != cameraInfos.end(); ++it)
std::cout << it->description().toStdString().c_str() << std::endl;
}
此函数返回时发生崩溃。如果我这样做:
foreach(const QCameraInfo &ci, QCameraInfo::availableCameras());
在foreach循环的评估中发生崩溃。同样,如果我将QList<QCameraInfo> cameraInfos
声明为类中的字段,则会在类被销毁时发生崩溃。这由我的调用堆栈的输出验证:
ntdll.dll!000000007750eef1() Unknown
kernel32.dll!00000000773c1a0a() Unknown
> VideoCapture.exe!free(void * pBlock) Line 51 C
VideoCapture.exe!QCameraInfo::`scalar deleting destructor'(unsigned int) C++
VideoCapture.exe!QList<QCameraInfo>::node_destruct(QList<QCameraInfo>::Node * from, QList<QCameraInfo>::Node * to) Line 484 C++
VideoCapture.exe!QList<QCameraInfo>::dealloc(QListData::Data * data) Line 857 C++
VideoCapture.exe!QList<QCameraInfo>::~QList<QCameraInfo>() Line 817 C++
我正在使用Visual Studio 2013(很明显是Windows)。
答案 0 :(得分:1)
您需要自己编译Qt,然后在调试器下运行测试用例并查看它崩溃的位置。您还需要一个最小的,自包含的测试用例 - 这必须是问题的一部分(SSCCE)。事实上,你更有可能在其他地方破坏内存,你看到的失败是堆损坏的结果,而不是Qt错误。
补充工具栏:您需要精通在Qt Creator中运行小例子。可以说,Qt Creator附带的模板并不是很好。你可以use this template作为其他项目 - &gt;简单的qmake,来制作快速原型。
以下在OS X 10.9和Windows 10 / VS 2015上使用当前Qt上的1个摄像头可以正常工作。您使用的std::cout
是红色鲱鱼,您可以使用qDebug()
作为好。
// https://github.com/KubaO/stackoverflown/tree/master/questions/camlist-37603946
#include <QtWidgets>
#include <QtMultimedia>
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QComboBox combo;
QObject::connect(&combo, &QComboBox::currentTextChanged, [&]{
std::cout << combo.currentText().toStdString() << std::endl;
});
for (auto const & info : QCameraInfo::availableCameras())
combo.addItem(info.description());
combo.show();
return app.exec();
}
答案 1 :(得分:0)
因此,在遵循Kuba的建议并在我的环境中使用新构建的Qt库运行他的测试程序之后,我得到了相同的错误。然后我有一个明智的想法是以release
模式而不是debug
运行它。瞧,它工作得很好,新建的Qt5(x86,发生了)和预先构建的二进制文件(64位)来自Qt的下载页面。
似乎链接到qt debug
库导致了这种行为。我现在在调试模式下链接到非调试库并且很高兴 - 在大多数情况下 - 我仍然有点恼火的是,带有'd'后缀的qt库似乎无法正常工作我的系统。不过,我可以继续开发这个项目。
感谢所有评论和回答!