我正在创建一个视频应用程序。
启动此应用后,您会在屏幕上看到一个VideoWidget循环播放列表以及其他窗口小部件。通过单击VideoWidget,VideoWidget将进入全屏模式,并在其上方放置一个音量滑块。如果在全屏模式下再次单击,它将显示为正常。
为此,我创建了2个类。首先,我创建了一个主类,其中包含所有小部件,包括视频小部件。其次,我创建了一个自定义VideoWidget类。我在这个VideoWidget类中实例化了Qslider,并在我的主类中实例化了一个VideoWidget对象,该对象的对象已在main.cpp中实例化。
我实现了预期的目标。除非滑块不会立即更新其位置。如果您单击以显示正常,然后单击以全屏返回,则只会更新位置。在全屏模式下,音量会改变,但UI中的滑块位置不会改变。
我想问我做错了什么?我应该怎么做才能在UI中更新滑块位置?
代码段: 在VideoWidget.h中
class VideoWidget : public QVideoWidget
{
Q_OBJECT
QVideoWidget* videoWidget;
QMediaPlaylist* playlist;
QMediaPlayer *player;
public:
VideoWidget();
QSlider* slider;
};
在VideoWidget.cpp中
VideoWidget::VideoWidget()
: videoWidget(new QVideoWidget(this)),
slider(new QSlider(Qt::Horizontal, this))
{
/*QMediaplaylist *playlist, QMediaPlayer *player instantiated here*/
slider->hide();
slider->setGeometry(300,735,600,20);
slider->setRange(0, 100);
slider->setValue(player->volume());
connect(slider, &QSlider::valueChanged, player, &QMediaPlayer::setVolume);
}
void VideoWidget::changeEvent(QEvent *event)
{
if(event->type() == QEvent::WindowStateChange)
slider->setVisible(windowState() == Qt::WindowFullScreen);
QWidget::changeEvent(event);
}
enter code here
void VideoWidget::resizeEvent(QResizeEvent* event) {
videoWidget->resize(size());
event->accept();
}
void VideoWidget::mousePressEvent(QMouseEvent *event)
{
this->setFullScreen(!isFullScreen());
event->accept();
}
在MainWidget.cpp中
mainwidget::mainwidget(QWidget *parent)
: QWidget(parent)
{
videoWidget = new VideoWidget(); // the video container
videoWidget->setFixedSize(500, 300);
QBoxLayout *displayLayout = new QHBoxLayout;
displayLayout->addWidget(videoWidget, 2);
QBoxLayout *layout = new QVBoxLayout;
layout->addLayout(displayLayout);
setLayout(layout);
videoWidget->setGeometry(100,100,300,400);
videoWidget->show();
}
视频设置为全屏,并出现滑块。滑块可以控制媒体播放器的音量,但问题是,拖动时它不会移动。
答案 0 :(得分:0)
您在描述问题所在的方式上非常困惑,但是如果我没问题,QSlider不会跟踪鼠标,但是您可以通过单击来更改音量,大概是单击一下即可。
您已连接valueChanged
信号,如果sliderReleased()
属性为tracking
,则该信号仅在false
之后发出。如果要连续调节音量,则必须处理Pressed \ Moved \ Released组信号,或者可以使用QSlider的内置功能(通常就足够了):
slider->setTracking(true);