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