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

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 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器