写在前面:
这部分对应视频课程中的4-6~4-7。实现视频显示和窗口大小同步变化、以及重载QT滑动条点击控制播放进度。
9、视频窗口大小变化
拖放视频的时候,视频窗口和播放窗口会出现不一致的情况,导致出现白边,所以接下来要解决这个问题,让视频窗口跟随播放窗口动态变化。
首先在Xplay.h中添加一个void resizeEvent(QResizeEvent*e);当窗口发生变化的时候,就会调用这个函数。
void Xplay::resizeEvent(QResizeEvent *e)
{
ui.videoWidget->resize(size());
ui.pushButton->move(5, this->height() - 50);
ui.pushButton_2->move(this->width() / 2 -25, this->height() - 55);
ui.playslider->move(20, this->height() - 75);
ui.playslider->resize(this->width() - 25,ui.playslider->height());
ui.totaltime->move(this->width() - 60, height() - 65);
ui.playtime->move(this->width() - 110, height() - 65);
}
在该函数中,我们只要做几件事,当窗口发生变化的时候,改变视频窗口的大小和几个图标的大小就可以了。
这里有一个问题,当播放窗口拖动的时候,视频窗口也跟随了,但之前我们申请的视频窗口的内存空间就会变小,因此就需要重新申请内存。
void VideoWidget::paintEvent(QPaintEvent *e)
{
static int w = 0;
static int h = 0;
if (w != width() || h != height())
{
if (image) //当image不为空的时候,才重新申请
{
delete image->bits();
delete image;
imaeg = NULL;
}
}
.......
}
10、QT滑动条重载
目前这个播放器拖动滑动条是可以,但是点击滑动条的时候是没办法让视频定位到指定位置,这时候需要重新定义一个滑动条控件。
首先再创建一个新类XSlider,然后继承QSlider,注意,所有的QT类都要加上Q_OBJECT,包含了Q_OBJECT的话,在编译的时候,系统会自动将文件的信号和槽做相应的处理。
然后创建void mousePressEvent(QMouseEvent *e);函数,用于重载鼠标事件void XSlider::mousePressEvent(QMouseEvent *e)
{
int value = ((float)e->pos().x() / (float)this->width()) * (this->maximum()+1);
this->setValue(value);
QSlider::mousePressEvent(e);
}
最后将进度条控件实现方法切换成我们自己写的代码就可以了。