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中發射信號。。。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章