qt编程遇到的小问题

1、如果类继承的是QMainWindow则在底层QWidget上面会加上Central Widget等QWidget,所以如果类继承的是QMainWindow则在上面添加QWidget的时候需要

QWidget* p= this->centralWidget()->setLayout(m_mainLayout);如果不用setupui加载那些QWidget则没有必要继承QMainWindow

如果类继承的是QWidget则在上面添加QWidget的时候只需要

setLayout(m_mainLayout);即可

 

2、今天遇到了一个让人费解的问题,昨天在公司加班调了好几个小时,今天终于知道了。。。

首先只要程序一启动就会调用paintEvent这个系统函数,我再这里重写了这个函数,是为了在QLabel上面显示视频图像

void ET_Player::paintEvent(QPaintEvent *e)

{

    QPainter painter(this);

   painter.fillRect(m_videoplay->x(),m_videoplay->y(),m_videoplay->width(),m_videoplay->height(), QColor(0, 0 ,0));

    if (qImg!=NULL)

    {

        painter.drawImage(QPoint(m_videoplay->x(),m_videoplay->y()),*qImg);

    }

}

通过这个才知道painter的参数只能是this,而下面的drawImage无论往什么QWidget上面画只要把控件的起始坐标传进来就可以了

void ET_Player::nextFrame()

{

    frame = cvQueryFrame(capture);

   

    if (frame)

    {

 

        if (frame->origin == IPL_ORIGIN_TL)

        {

            cvCopy(frame,iplImg,0);

            //cvSaveImage("D:/3.jpg",frame);

            //qImg->save("B.png","PNG");

       

        }

        else

        {

            cvFlip(frame,iplImg,0);

        }

 

        cvCvtColor(iplImg,iplImg,CV_BGR2RGB);

        //cvCvtColor(iplImg,eye_imagegray,CV_BGR2GRAY);

        emit valueChanged(n);

        n++;

 

        this->update();

 

    }

}

void ET_Player::OnOpen()

{

 

    QString fileName = QFileDialog::getOpenFileName(this,tr("open file"), " ",tr("Allfile(*.*);;avifile(*.avi)"));

    //const char *str = fileName.toAscii().constData();

 

    QByteArray ba = fileName.toLatin1();

    const char *c_str2 = ba.data();

    capture = cvCreateFileCapture(c_str2);

    frames = cvGetCaptureProperty( //获取视频的帧数

        capture,

        CV_CAP_PROP_FRAME_COUNT

        );

    m_slider->setRange(0,frames);

 

    if (capture)

    {

        frame = cvQueryFrame(capture);

            //cvSaveImage("D:/2.jpg",frame);

        if (frame)

            this->resize(frame->width,frame->height);

       

        qImg = new QImage(QSize(frame->width,frame->height),

            QImage::Format_RGB888);

        iplImg = cvCreateImageHeader(cvSize(frame->width,frame->height),

            8,3);

        //cvCopy(frame,iplImg);

        //Q_ASSERT(iplImg);

        iplImg->imageData = (char*)qImg->bits();

        //cvSaveImage("D:/1.jpg",iplImg);

        timer = new QTimer(this);

        timer->setInterval(30);

        connect(timer,SIGNAL(timeout()),this,SLOT(nextFrame()));

        timer->start();

    }

}

paintEvent不只是update时会调用,窗口重绘的时候都会调用,所以窗口发射信号让slider滑动的时候不能再paintEvent中发射信号,而必须在用户设定的30ms执行一次的nextFrame中发射信号。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值