第九章:ffmpeg和QT开发播放器之视频播放控制(3)

写在前面:  

    这部分对应视频课程中的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);
}
        最后将进度条控件实现方法切换成我们自己写的代码就可以了。

                            


猜你喜欢

转载自blog.csdn.net/tainjau/article/details/79874947