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中发射信号。。。