你什么都想学 2020-09-09 23:32 采纳率: 100%
浏览 1904
已采纳

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);
    imag    = new QImage();         // 初始化
    /*信号和槽*/
    connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));  // 时间到,读取当前摄像头信息
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(openCamara()));//打开摄像头
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(takingPictures()));//抓取 画面帧
    connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(closeCamara()));//关闭摄像头
    connect(ui->pushButton_4,SIGNAL(clicked()),this,SLOT(Video()));//进行录像存储
    connect(ui->pushButton_5,SIGNAL(clicked()),this,SLOT(videoDoms()));//录像播放
    connect(ui->pushButton_6,SIGNAL(clicked()),this,SLOT(stopVideo()));
}



void Widget::openCamara()
{
    cam = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
    timer->start(33);              // 开始计时,超时则发出timeout()信号

}

void Widget::readFarme()
{
    frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
    // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
   // QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
    QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height,
                          QImage::Format_RGB888).rgbSwapped();
    ui->label->setPixmap(QPixmap::fromImage(image));  // 将图片显示到label上
}

void Widget::takingPictures()
{
    frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
    // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
  //  QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
    QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height,
                          QImage::Format_RGB888).rgbSwapped();
    ui->label_2->setPixmap(QPixmap::fromImage(image));  // 将图片显示到label上
}

void Widget::closeCamara()
{
    timer->stop();         // 停止读取数据。
    cvReleaseCapture(&cam);//释放内存;
    ui->label->setAlignment(Qt::AlignCenter);
    ui->label->setText(tr("摄像头已关闭!"));
}

void Widget::Video()
{
  //  CvCapture* capture = cvCaptureFromCAM(-1);
    CvVideoWriter* video = NULL;
    frame = NULL;
    int n;
    if(!cam) //如果不能打开摄像头给出警告
    {
       qDebug()<<"Can not open the camera.";
    }
    else
    {
       frame = cvQueryFrame(cam); //首先取得摄像头中的一帧
       video = cvCreateVideoWriter("k:\\camera.avi", CV_FOURCC('X', 'V', 'I', 'D'),
                                   8,cvSize(frame->width,frame->height)); //创建CvVideoWriter对象并分配空间

     //保存的文件名为camera.avi,编码要在运行程序时选择,大小就是摄像头视频的大小,帧频率是32
       if (video) //如果能创建CvVideoWriter对象则表明成功
       {
          qDebug()<<"VideoWriter has created.";
       }
       cvNamedWindow("Camera Video",1); //新建一个窗口
//       int i = 0;
//       int x = 200;// 让它循环200次自动停止录取
       while(1)
       {
           frame = cvQueryFrame(cam); //从CvCapture中获得一帧
           if(!frame)
           {
              qDebug()<<"Can not get frame from the capture.";
              break;
           }
           n = cvWriteFrame(video,frame); //判断是否写入成功,如果返回的是1,表示写入成功

           cvShowImage("Camera Video",frame); //显示视频内容的图片
          // i++;
           if (cvWaitKey(2)>0)
              break; //有其他键盘响应,则退出
           //if (i > x) break;
        }
        cvReleaseVideoWriter(&video);
        cvDestroyWindow("Camera Video");
   }
}
void Widget::videoDoms()
{
    capture = 0;
    capture = cvCaptureFromFile("k:\\camera.avi");
    cvNamedWindow("src", 0);
    IplImage *frame2 = 0;
    int key;
    for(;;){
        frame2 = cvQueryFrame(capture);
        if(!frame) break;
        cvShowImage ("src",frame2);
        key = cvWaitKey(10);
        if((char)key == 'e') break;
    }
    cvDestroyAllWindows();
    cvReleaseCapture(&capture);
}
void Widget::stopVideo()
{
//    cvDestroyAllWindows();
//    cvDestroyWindow("src");
//    cvReleaseCapture(&capture);
}

Widget::~Widget()
{
    delete ui;
    timer->stop();         // 停止读取数据。
    cvReleaseCapture(&cam);//释放内存;

}

  • 写回答

3条回答 默认 最新

  • threenewbee 2020-09-10 08:02
    关注

    在Widget的类定义中加上
    public:
    ~Widget();

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?