我使用QT和QCamera对象在对话框中显示来自摄像机的视频提要。我的代码如下;
cameratestdialog.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CameraTestDialog</class>
<widget class="QDialog" name="CameraTestDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QCameraViewfinder" name="viewfinder" native="true">
<property name="geometry">
<rect>
<x>40</x>
<y>40</y>
<width>281</width>
<height>201</height>
</rect>
</property>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>QCameraViewfinder</class>
<extends>QWidget</extends>
<header>qcameraviewfinder.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>cameratestdialog.h
#ifndef CAMERATESTDIALOG_H
#define CAMERATESTDIALOG_H
#include <QDialog>
#include <QCamera>
namespace Ui {
class CameraTestDialog;
}
class CameraTestDialog : public QDialog
{
Q_OBJECT
public:
explicit CameraTestDialog(QWidget *parent = 0);
~CameraTestDialog();
private:
Ui::CameraTestDialog *ui;
QCamera *camera;
};
#endif // CAMERATESTDIALOG_Hcameratestdialog.cpp
#include "cameratestdialog.h"
#include "ui_cameratestdialog.h"
#include <QCameraViewfinder>
#include <QDebug>
CameraTestDialog::CameraTestDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::CameraTestDialog),
camera(0)
{
ui->setupUi(this);
this->setAttribute(Qt::WA_DeleteOnClose);
delete camera;
camera = new QCamera;
camera->setViewfinder(ui->viewfinder);
camera->start();
}
CameraTestDialog::~CameraTestDialog()
{
qDebug() << "Stopping Camera";
camera->stop();
camera->unload();
//delete camera;
delete ui;
}在cameratestdialog.cpp中的析构函数中,您可以看到我已经注释掉了删除相机的行。当我像这样运行这个程序时,它工作得很好(我尝试过发布和调试模式),我可以在没有崩溃的情况下多次显示和关闭对话框。当我取消注释这一行时,当调用析构函数时,程序意外崩溃。
我正在启动对话
CameraTestDialog *dlg = new CameraTestDialog();
dlg->show();我很高兴离开delete camera行的注释,所以我的程序运行,但这不意味着我泄漏内存每次对话框关闭?停止和删除QCamera对象的正确方法是什么?
我正在使用QT 2.8.1运行在2012年的Mac下的小牛下。
编辑:
我没有安装调试器,因此在这一点上我没有更多关于崩溃本质的可用信息。
我怀疑camera->stop()和camera->unload()调用是异步的,因此相机在实际停止之前就被删除了。为了测试这一点,我添加了while循环来检查摄像机的状态,并阻塞,直到摄像机被确认停止,并卸载。我发现这些函数实际上是同步的,并且仍然有相同的症状(在调用delete之后的一段时间内崩溃)。
编辑2:
我尝试将对照相机的引用更改为基于堆栈的引用,而不是new-based,并删除了删除行。这样做后,程序在构造函数期间崩溃,然后显示对话框。
编辑3:
我刚刚确认这个程序不会在Windows 7上崩溃,所以我假设这是OSX计算机上QCamera的QT实现中的一个低级错误。我将尝试使用QT项目来引发一个bug。
发布于 2015-10-09 07:12:44
问题是QCamera似乎运行在线程中。删除它“太早”会在Windows上导致QMutuex错误。因此,解决方案是camera->stop();而不是camera->unload();。
最后,也是最重要的一点:使用delete camera代替
camera->deleteLater();https://stackoverflow.com/questions/22056348
复制相似问题