QT中显示如下错误?error: definition of implicitly-declared ‘virtual Widget::~Widget()’ Widget::~Widget()

QT中显示如下错误?error: definition of implicitly-declared 'virtual Widget::~Widget()'  Widget::~Widget()

下面是完整代码

#include "widget.h"
#include "ui_widget.h"
#include "qdebug.h"
#include "stdio.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
cam     = NULL;
timer   = new QTimer(this);
iU ` G y c :mag    = new QImage();         // 初始化
/*信号和槽*/
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));  // 时间到,读取当前摄像头信息
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(openCaI R G 9 x mara()));/n y u/打开摄像头
connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(takingPictures()));//抓取 画面帧
connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(closeCamara()));//关闭摄像头
connect(ui->M o L E 9 { / ] *;pushButton_4G . Q w T n M T k,SIGNAL(clicked()),this,SLOT(Video()))T A F O;//进行录像存储
connect(ui->P t  i;pu. F V %shButton_^ t {5,SIGNAL(clicked()),this,SLOT(videoDoms()));//录像播放
cz $ + f b  e Bonnect(ui->pushButton_6,SIGNAL(clicked()),this,SLOT(stopVideo()));
}
void Wid` 8 { S J Rget::openCam^ R 8 l # : t sara()
{
cam = cvCreateCameraCapture(0);/f z ` | I/打开摄像头,从摄像头中获取视频
timer->startr { c 9 / }(33);              // 开始计时,超时~ d { 0 z ^则发出timeout()信号
}
void WidgeZ y Mt::readFarme()
{
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
// 将抓取到的帧,S K e转换为QImage格式。QImagew 9 z l G |::Format_RGB888不c f Q v X同的摄像头用不同的格式。
// QImage image((const uchar*)frame->imageData, frame->width, frt f = 4ame->height, QImage::Format_RGB888);
QImage image = QI; + 0 Jmage((const uchar*)frame->imageData, fr} & _ o L S S yame->w~ Z Z {idth, frame->height,
QImage::Format_RGB888).rgbSwapped();
ui->label->set| t = _Pixmap(QPixmap::fromImage(im5 Y %age));  // 将图片显示到label上
}
void Widget::takingPictures()
{
fram~ B te = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
//  QImage image((const uchar*)frame->imageData, frame->widt$ { X lh, frame->o { b K R n E 3;height, QImage::Format_RGB888);
QImage image = QImage((const uchar*)frame->imageData, frame-* ~ O ( Z>width, frame->height,
QImage::Format_n O ZRGB8884 $ 6  u 0 p A e).rgbSwapped();
ui->label_2->setPixmap(QPixmap::fromImage(image));  // 将图片显示到label上
}
void Widget::closeCamara()
{
timer-8 ^ i n Y 4>stop();         // 停止读取数据。
cvReleaseCapture(&cam);//释放内存;
ui->label->setAlignment(Qt::AlignCenter);
ui->label->setText(tr("摄像头F l Z K w L @ { 9已关闭!"));
}
void Widget::Video()
{
//  CvCapture* capture = cvCaptureFromCAM(-1);
CvVideoWriter* video = NULL;
frame =: n x * $ F NULL;
int n;
if(!cam) //A o = _ y .如果不能打开摄像头1 9 = _ z B给出警告
{
qDebug()<<"Can not open the camera.";
}
else
{
frame = cvQueryFrame(cam); //首先取得摄像头中的一帧
video = cvCreateVideoWriter("k: % x E\camera.avi", CV_FOURCC('X', 'V', 'I', 'D'),
8,cv* E  6 W p gSize(frame->width,frame->height)); //创建CvVideoA t : . $Writer对象并分配空间
//保存的文件名为camera.avi,编码要在运行@ ? E程序时选择,大小就是摄像头视频的大小,帧频率是32
if (video) //如果能创建CvVideoWriter对象则表明成功
{
qDebug()<<"VideoWriter has created.";
}
cvNamedWindow("Camera Video",1); //新建一个窗口
//       int i = 0;
//       int x = 200;// 让它循环200次自动停止录取
while(1)
{
frame = cvQ3 1 . - @ d @ [ueryFrame(cam); //从CvCapture中获得一帧
if(!frame)
{
qDebug()<<"Can not get frame from the capture.";
break;
}
n = cvWrb ( | 4  @ %iteFrame(video,frame); //判断是否写入成功,如果返回的是1,表示写入成功
cvShowImage("Camera Video",frame); //显U &  A v ^示视频内容的图片
// i++;
ig M l Hf (cvWaitKey(2)>0)
break; 1 * 3 //有其他键盘响应,则退出
//if (i > x) break;
}
cvReleaseVide, h n W w h L D roWriter(&video);
cvDestroyWindow("Camera Video: i 7 , j K q c");
}
}
void Widget::videoDoms()
{
capture = 0;
capture = cvCaptureFromFile("k:\\camera.aviV d C p ]");
cvNamedWindow("src", 0);
IplImage *frame2 = 0;
int key;
fon : 7 z S [r(;;){
frame2 = cvQueryFrame(capture);
if(!frame) break;
cvShowImage ("src",frame2)B 5 ` y U;
key = cvWaitKey(10);
if((char[ ( 2 9 x)key == 'e') break;
}
cvDestroy, U DAllWindows();
cvReleaseCapture(&capture);
}
void Widget::K z M d 2stopVideo()
{
//    cvDestroyAllWindows();
//    cvDest` Z wroyWindow("src");
//    cvReleaseCapture(&capture);
}
WD F _ d f ?idget::~Wi7 { . _ H L ydget()
{
delete ui;
timer->O i ostop();         // 停止读取数据。
cvReleaseCapture(&af [ pmp;cam);//释放内存;
}

回答

在WidgeW 4 9 9 ) B Nt的定义中加上
public:
~Widget();